Ich bin gerade dabei, eine (funktionierende) App von EclipseLink nach Hibernate JPA zu verschieben, meistens ist es ziemlich flüssig, aber ich finde eine Sache, die ich nicht erklären kann und kann Denk an gute Suchbegriffe!Hibernate JPA - ManyToOne-Beziehung nicht ausgefüllt
Grundsätzlich ich vier Einheiten haben, mit einer Eins-zu-viele-Beziehungen eine Kette bilden:
Entität hat eine Liste der Entität ist, von denen jede eine Liste von EntityC der hat, von denen jede eine Liste von EntityD die haben
jeder von denen hat dann eine viele-zu-eins-Beziehung in die andere Richtung, so:
EntityD eine EntityC hat, die eine Entität hat, die eine Entität hat.
Das heißt (stark für Klarheit reduziert):
@Entity
public class EntityA {
@OneToMany (cascade = CascadeType.All, mappedBy = "entityA")
private List<EntityB> entityBList;
...
}
@Entity
public class EntityB {
@OneToMany (cascade = CascadeType.All, mappedBy = "entityB")
private List<EntityC> entityCList;
@JoinColumn (name = "ENTITY_A", referencedColumnName = "ENTITY_A_ID")
@ManyToOne (cascade = CascadeType.PERSIST, optional = false)
private EntityA entityA;
}
@Entity
public class EntityC {
@OneToMany (cascade = CascadeType.ALL, mappedBy = "entityC")
private List<EntityD> entityDList;
@JoinColumn (name = "ENTITY_B", referencedColumnName = "ENTITY_B_ID")
@ManyToOne (cascade = CascadeType.PERSIST, optional = false)
private EntityB entityB;
}
@Entity
public class EntityD {
@JoinColumn (name = "ENTITY_C", referencedColumnName = "ENTITY_C_ID")
@ManyToOne (cascade = CascadeType.PERSIST, optional = false)
private EntityC entityC;
}
ich eine Entität aus der Datenbank erhalten (suchen sie durch ihre Primärschlüssel) und damit eine schön bevölkerten Entität Instanz erhalten, mit einem PersistentBag für mein List<EntityB>
. Ich sehe eine Lazy Load passiert, wenn ich das List<EntityB>
dereferenzieren, und das gleiche wiederholt, um EntityCs von EntityB zu bekommen.
An diesem Punkt ist alles wie erwartet, ich habe eine EntityA, B und C alle vollständig mit den Werten aus der Datenbank gefüllt, aber dann versuche ich meine EntityD, von EntityC, und finden Sie, dass es null ist.
Mein Entity-Manager ist zu diesem Zeitpunkt noch offen und aktiv, und selbst wenn ich ihn im Debugger direkt nach dem Erwerb von EntityA anschaue, kann ich die Beziehungen bis EntityC durchgehen und wieder 'entityDList' sehen 'als null.
Die einzige Lösung, die ich bisher gefunden habe, ist, zu verwenden:
EntityManager.refresh(entityC);
der alle Elemente, die eine träge belastete PersistentBag für die entityDList auffüllt.
Also, meine Vermutung ist, dass Hibernate nur die Referenzen 2 Ebenen tief (oder 3, je nachdem, wie Sie zählen) bevölkern, und danach aufgeben, obwohl ich nicht wirklich verstehe, warum das wäre. Macht das irgendjemanden Sinn?
Gibt es eine andere Lösung als die .refresh? Eine Art Konfigurations- oder Annotationswert, der Hibernate dazu bringt, die Referenzen vollständig aufzufüllen?
Welcher Wert ist für den Hibernate-Konfigurationsparameter "max_fetch_depth" eingestellt? –