2015-05-18 11 views
7

Mam problem z następującymi podmiotami: Las, Drzewo, Liść. Jak można sobie wyobrazić, las może mieć wiele drzew, a drzewo ma wiele liści.Leniwe ładowanie dzieci, które mają chętne kolekcje wewnątrz

Chciałbym leniwej załadować wszystkie drzewa w lesie i chciałem załadować wszystkie liście z drzewa. Mój kod z Hibernacja adnotacje wygląda następująco:

Forest.java

@Entity 
@Table(name = "Forests") 
public class Forest implements Comparable<Forest> { 

     @Id 
     @Column(name = "forestnumber", length=10, nullable=false) 
     private String number; 

     @OneToMany(fetch=FetchType.LAZY, mappedBy="forest") 
     private Set<Tree> trees = null; 

     // some other attributes and methods 

Tree.java

@Entity 
@Table(name = "Trees") 
public class Tree implements Comparable<Tree> { 

     @Id 
     @GeneratedValue(strategy=GenerationType.IDENTITY) 
     @Column(name="tree_id", nullable=false) 
     private int id; 

     @ManyToOne(fetch = FetchType.EAGER) 
     @JoinColumn(name = "forestnumber", nullable = false) 
     @Fetch(FetchMode.JOIN) 
     private Forest forest; 

     @OneToMany(fetch=FetchType.EAGER, mappedBy="tree") 
     @Fetch(FetchMode.JOIN) 
     private Set<Leaf> leafs = null; 

     // some other attributes and methods 

Leaf.java

@Entity 
@Table(name = "Leafs") 
public class Leaf implements Comparable<Leaf> { 

     @Id 
     @GeneratedValue(strategy=GenerationType.IDENTITY) 
     @Column(name="leaf_id", nullable=false) 
     private int id; 

     @ManyToOne(fetch = FetchType.EAGER) 
     @JoinColumn(name = "tree_id", nullable = false) 
     @Fetch(FetchMode.JOIN) 
     private Tree tree; 

     // some other attributes and methods 

Mój problem: Ładowanie lasu i wywoływanie metody getTrees() skutkuje zestawem wybranych instrukcji. Hibernate wykonuje jedną instrukcję, aby uzyskać wszystkie drzewa, a drugą dla każdego drzewa, aby zebrać wszystkie liście. Moim zdaniem hibernacja powinna generować tylko jedno oświadczenie, przy użyciu sprzężenia, do zbierania drzew i liści w tym samym czasie.

Czy ktoś może mi powiedzieć, powód mojego problemu i jak mogę to naprawić? Wielkie dzięki!

Do widzenia: Jeśli zmienię strategię pobierania drzew leśnych na EAGER, wszystko działa dobrze, z jednym tylko stwierdzeniem.

Odpowiedz

0

Usuń fetch = FetchType.EAGER. Chętne pobieranie wyzwala kaskadowe instrukcje select.

+0

Dziękuję za odpowiedź. Liście powinny się spieszyć. Ale zamiast instrukcji select dla każdego drzewa, chciałbym mieć tylko jeden wybór z łączeniem. Jak widać, użyłem adnotacji @Fetch, aby powiedzieć hibernacji, aby używało JOIN. Ale to działa tylko wtedy, gdy chcę załadować drzewa leśne. Czemu? –

+0

Spróbuj usunąć fetch = FetchType.EAGER z @OneToMany (fetch = FetchType.EAGER, mappedBy = "tree") pod zbiorem liści, aby rozwiązać problem. – SanyaLuc

+0

Usuwanie fetch = FetchType.EAGER z @OneToMany (fetch = FetchType.EAGER, mappedBy = "drzewo") nie pomogło –

Powiązane problemy