Ich habe dieses Problem für eine lange Zeit jetzt, ich habe das Internet und SO hinein und heraus gesucht und habe noch keine Lösung gefunden. Ich hoffe du kannst mir dabei helfen.Hibernate @ OneToMany mit mappedBy (Eltern-Kind) Beziehung und Cache-Problem
Ich habe eine Eltern-Kind-Beziehung zwischen zwei Entitäten wie folgt aus:
@Entity
public class Parent {
// ...
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
private Set<Child> children = new HashSet<Child>();
// ...
}
@Entity
public class Child {
// ...
@ManyToOne(fetch = FetchType.LAZY)
private Parent parent;
// ...
}
Die Sache ist, dass, wenn ich ein neues Kind schaffen und es zu einem übergeordneten zuweisen, die Mutter nicht aktualisiert, wenn Es ist bereits im Cache.
Parent parent = new Parent();
em.persist(parent);
// ...
Child child = new Child();
child.setParent(parent);
em.persist(child);
parent.getChildren().size(); // returns 0
Ich habe versucht, @PreUpdate zu verwenden, um automatisch das Kind zum Vater hinzu, wenn das Kind beibehalten wird, aber in dem Fall, wenn haben wir 2 Entity-Manager in zwei verschiedenen Threads (wie in JBoss), das Thema existiert noch, bis wir anrufen em.refresh(parent)
So ist die Frage - gibt es einen Weg, um das Problem reibungslos zu beseitigen und sicherzustellen, dass parent.getChildren()
immer die aktuelle Liste der Kinder zurückgeben?
Vielen Dank für Ihre umfassende Antwort, Michael zu finden. Ich habe ein paar gute Informationen gefunden. Aber ich fürchte, es löst nicht das Problem, das ich habe, weil zwei verschiedene EntityManager-Instanzen zwei verschiedene Caches enthalten und wenn einer von ihnen eine Entitätsinstanz aktualisiert, sieht der andere die Aktualisierung nicht und die zwischengespeicherte Entität wird veraltet – artemb
Klingt so, als müssten Sie sich die Update-Trigger ansehen, die dann das Objekt übernehmen und den anderen Cache aktualisieren. Oder Sie können diese beiden Caches zu Mitgliedern desselben Clusters machen, wenn Sie das Clustern von Lösungs-Clustern zwischenspeichern. –
Leider habe ich keinen Einfluss auf den Sitzungscache von Hibernate. Oder habe ich? – artemb