Ho un problema con le seguenti entità: Foresta, Albero, Foglia. Come puoi immaginare una foresta può avere molti alberi e un albero ha molte foglie.Bambini con carico pigro, che hanno collezioni interessanti all'interno di
Mi piacerebbe pigro caricare tutti gli alberi di una foresta e caricare tutte le foglie di un albero. Il mio codice con annotazioni Hibernate è simile al seguente:
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
Il mio problema: il caricamento di una foresta e la chiamata al metodo getTrees() restituiscono un insieme di istruzioni selezionate. Hibernate esegue una dichiarazione per ottenere tutti gli alberi e una seconda per ogni albero per raccogliere tutte le foglie. Secondo me l'ibernazione dovrebbe generare solo una dichiarazione, usando un join, per raccogliere alberi e foglie allo stesso tempo.
Qualcuno può dirmi, la ragione del mio problema e come posso risolverlo? Grazie mille!
A proposito: se cambio la strategia di recupero degli alberi della foresta in EAGER, tutto funziona correttamente, con una sola istruzione.
Grazie per la risposta. Le foglie dovrebbero essere impazienti. Ma invece di selezionare le istruzioni per ogni albero, mi piacerebbe avere solo una selezione con un join. Come puoi vedere, ho utilizzato @Fetch Annotation per indicare a Hibernate di utilizzare i JOIN. Ma funziona solo se carico anche gli alberi della foresta. Perché? –
Provare a rimuovere fetch = FetchType.EAGER da @OneToMany (fetch = FetchType.EAGER, mappedBy = "albero") sotto la raccolta foglia per correggere il problema – SanyaLuc
Rimuovere fetch = FetchType.EAGER da @OneToMany (fetch = FetchType.EAGER, mappedBy = "albero") non ha aiutato –