2016-07-21 26 views
0

Ich habe eine Entität Parent und eine Relation @OneToMany zu einer anderen Entität Child. Die Auflistung untergeordnete Elemente ist auf "lazy loading" eingestellt.Wie kann ich eine verschachtelte Sammlung laden?

@Entity 
class Parent{ 
    @Id 
    String parentId; 
    @OneToMany(mappedBy="parent",fetch=FetchType.LAZY) 
    List<Child> children; 
} 

@Entity 
class Child{ 
    @Id 
    String childId; 
    @ManyToOne 
    @JoinColumn(name="parentId") 
    Parent parent; 
} 

List<Parent> loadParents() { 
    QParent qParent = QParent.parent; 
    List<Parent> parentList = query.select(qParent).from(qParent).fetch(); 
    return parentList; 
} 

@Transactional 
void test(){ 
    List<Parent> parentList = loadParents(); 
    for(Child child:parentList.getChildren()){ 
     child.getChildId(); 
    } 
} 

ich die berühmte

org.hibernate.LazyInitializationException: lazily gescheitert eine Sammlung von Rolle zu initialisieren ... konnte nicht Proxy initialisieren - keine Session

Ausnahme in die Methode test() in der Zeile, in der ich auf die Kinderliste zugreife.

Ich möchte die Annotation des Abruftyps in der Entität nicht ändern.

Wie greife ich auf die untergeordneten Entitäten zu?

Antwort

1

Ich fand den Schuldigen. Die Transaktionsverwaltung wurde deaktiviert. Die @Transactional Annotation fehlte in der Testmethode.

Um ermöglichen Transaktionsmanagement, setzen diese in anwendungs ​​context.xml:

<tx:annotation-driven /> 

Es gibt nichts falsch mit dem Code ist, aber die Konfiguration unvollständig war. Um verschachtelte Sammlungen zu laden, brauchen wir nur eine umfassende Transaktion.

Durch Aktivieren der Debugprotokollierung für org.springframework.orm und org.hibernate konnte ich die Ursache des Problems ermitteln.

Ähnliche Fragen und Antworten: LazyInitializationException in JPA and Hibernate