Ich habe zwei Einheiten, Bücher und Kommentare, in einer Eins-zu-viele-Beziehung (ein Buch kann viele Kommentare haben). Ich möchte Bücher und Kommentare zu einem Buch auflisten können. Ich möchte, dass es denormalisiert wird, was bedeutet, dass die Buch-Entität einen Zähler mit einer Anzahl von Kommentaren für dieses Buch hat und jedes Mal aktualisiert wird, wenn ein Kommentar eingegeben wird (einfach mit dem Konzept spielen, keine Notwendigkeit, hier zu denormalisieren)).Spring JPA eins zu viele denormalized count Feld
Ich denke (korrigieren Sie mich, wenn ich falsch liege) dies könnte leicht mit einem Trigger in der Datenbank getan werden (wann immer ein neuer Kommentar erstellt wird, aktualisieren Sie einen Zähler in der Tabelle Bücher auf die entsprechende bookId), aber um des willen Ich möchte es durch JPA machen, wenn es Sinn macht.
Was ich habe, so weit: // einige Anmerkungen weggelassen, nur allgemeine Informationen
Boks Einheit:
@Entity
public class Books {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String title;
private String author;
private Long numComments;
// getters and setters...
}
Kommentare Einheit:
@Entity
public class Comments {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String comment;
private Long authorId;
private Long bookId;
// getters and setters...
}
Bücher Repository: Ich hier hinzugefügt ein Abfrage zur Durchführung der Aktualisierung
/**
* Spring Data JPA repository for the Books entity.
*/
public interface BooksRepository extends JpaRepository<Books,Long> {
@Modifying
@Query("UPDATE Books v SET v.numComments = v.numComments + 1 WHERE v.id = :bookId")
int updateCounter(@Param("bookId")Long bookId);
}
Und jetzt die Frage: Was nun? Ich denke, ich kann das Update der Books-Entity, die mit @PostPersist kommentiert, mit einer Methode der Entity Comments versehen, aber bisher war ich nicht erfolgreich. Ich kann mir so etwas vorstellen:
@PostPersist //This function in the entity Comments
protected void updateBooks() {
//Likely some call to the repository here that updates the count
// in books the info we have from current entity.
}
Irgendeine Idee, wie man das macht? Einige Best Practices über diese Art der Denormalisierung in JPA? Besser die Datenbank-Trigger verwenden?