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.
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? –
Spróbuj usunąć fetch = FetchType.EAGER z @OneToMany (fetch = FetchType.EAGER, mappedBy = "tree") pod zbiorem liści, aby rozwiązać problem. – SanyaLuc
Usuwanie fetch = FetchType.EAGER z @OneToMany (fetch = FetchType.EAGER, mappedBy = "drzewo") nie pomogło –