2015-05-18 14 views
7

Tôi gặp vấn đề với các thực thể sau: Rừng, Cây, Lá. Như bạn có thể tưởng tượng một khu rừng có thể có rất nhiều cây, và một cây có rất nhiều lá.Trẻ em tải lười biếng, có bộ sưu tập háo hức bên trong

Tôi muốn lười tải tất cả các cây của một khu rừng và mong muốn tải tất cả các lá của cây. Mã của tôi với các chú thích ngủ đông trông giống như sau:

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 

Vấn đề của tôi: Đang tải một khu rừng và gọi phương thức getTrees() trong một tập hợp các câu lệnh chọn. Hibernate thực thi một câu lệnh để lấy tất cả các cây và một cây thứ hai cho mỗi cây để thu thập tất cả các lá. Theo quan điểm của tôi, hibernate chỉ nên tạo một câu lệnh, sử dụng phép nối, để thu thập cây và lá cùng một lúc.

Ai đó có thể cho tôi biết, lý do cho sự cố của tôi và cách tôi có thể khắc phục sự cố? Cảm ơn rất nhiều!

Tạm biệt: Nếu tôi thay đổi chiến lược tìm nạp cây rừng thành EAGER, mọi thứ sẽ hoạt động tốt, chỉ với một câu lệnh.

Trả lời

0

Xem Tháo lấy = FetchType.EAGER. Trình kích hoạt tìm nạp theo trình tự tạo các câu lệnh chọn tầng.

+0

Cảm ơn bạn đã trả lời. Những chiếc lá nên được háo hức. Nhưng thay vì chọn câu lệnh cho mỗi cây, tôi muốn chỉ có một lựa chọn với một tham gia. Như bạn có thể thấy tôi đã sử dụng chú thích @Fetch để nói hibernate để sử dụng JOIN. Nhưng điều này chỉ hoạt động, nếu tôi tải cây rừng háo hức quá. Tại sao? –

+0

Hãy thử xóa fetch = FetchType.EAGER khỏi @OneToMany (fetch = FetchType.EAGER, mappedBy = "tree") trong bộ sưu tập lá để khắc phục vấn đề của bạn – SanyaLuc

+0

Xóa fetch = FetchType.EAGER khỏi @OneToMany (fetch = FetchType.EAGER, mappedBy = "cây") không giúp được gì –

Các vấn đề liên quan