2011-03-25 28 views
9

Tôi có cùng câu hỏi với một người được đăng trong Cộng đồng Hibernate: FetchProfiles.Cách tải Hibernate FetchProfile để tải các đối tượng con sâu trong cấu trúc phân cấp

Đối với lý do hiệu suất Tôi có một mối quan hệ trong mô hình dữ liệu như sau:

...C -[FetchType.LAZY]-> D -> [FetchType.LAZY] -> E 

Sử dụng FetchProfile tôi có thể háo hức tải D với C, nhưng tôi không thể tìm ra cách để hăm hở nạp E. Tôi biết Tôi có thể sử dụng thành công một NamedQuery bằng cách sử dụng các kết nối bên trong, nhưng nó thực sự gây lỗi cho tôi rằng tôi không thể tìm ra cách thực hiện nó bằng cách sử dụng FetchProfile. Một ví dụ về một FetchProfile cố gắng (bất cứ thứ gì bị mất trong sương mù của thời gian):

@FetchProfile(name = "cwithDAndE", fetchOverrides = { 
     @FetchProfile.FetchOverride(entity = C.class, association = "dByCId", mode = FetchMode.JOIN), 
     @FetchProfile.FetchOverride(entity = D.class, association = "eByDId", mode = FetchMode.JOIN) 
}) 

tôi cho phép FetchProfile cho phiên làm việc và thành công sử dụng một session.get không có lỗi và C và D dân cư - E là vẫn lười biếng và không có dân số. Trong tuyệt vọng tôi nhớ cố gắng một ký hiệu chấm cho hiệp hội từ C xuống. Tôi chỉ có thể tìm thấy các ví dụ có độ sâu một.

Đây là khoảng cách loại OCD trong kiến ​​thức của tôi cần được lấp đầy!

Cảm ơn trước vì đã được trợ giúp.

+0

Bạn có thể đăng chú thích từ các lớp C, D và E không? (ngoài FetchTypes) –

Trả lời

3

Bạn có một obj A chứa obj B, chứa obj C. Theo mặc định họ là

...A -[FetchType.LAZY]-> B -> [FetchType.LAZY] -> C 

Một lớp:

@FetchProfiles({ 
    @FetchProfile(fetchOverrides = { @FetchOverride(association = "b", entity = A.class, mode = FetchMode.JOIN) }, name = "a-with-b") 
    }) 
@Entity 
@Table(name="EDITOR_IDENTITIES") 
public class A { 
    private B b;  
    //... 
} 

B lớp:

@FetchProfiles({ 
    @FetchProfile(fetchOverrides = { @FetchOverride(association = "c", entity = B.class, mode = FetchMode.JOIN) }, name = "b-with-c") 
    }) 
@Entity 
@Table(name="EDITOR_IDENTITIES") 
public class B { 
    private C c;  
    //... 
} 

Adão lớp:

@Repository(value="aDaoImpl") 
@Transactional 
public class ADaoImpl { 

    @Override 
    public A loadByPrimaryKey(long id) 
    { 
     Session session = sessionFactory.getCurrentSession(); 
     session.enableFetchProfile("a-with-b"); 
     session.enableFetchProfile("b-with-c"); 
     Criteria criteria = session.createCriteria(A.class); 
     criteria.add(Restrictions.eq("id", id)); 
     A a = (A) criteria.uniqueResult(); 
     if(identity != null) 
      return identity; 
     else 
      return null; 
    } 
} 

bạn sẽ nhận được A đầy B chứa C. Đây là một giải pháp rất cơ bản, bạn có thể xây dựng một phương pháp Dao lấy một danh sách lấy hồ sơ làm đối số.

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