2013-07-10 29 views
30

Tôi có một thực thể, trong đó có:Nhiều fetches với kiểu háo hức trong Hibernate với JPA

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "assessment") 
@OrderBy(value = "order ASC") 
private List<AssessmentPart> assessmentParts = new LinkedList<>(); 

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "assessment") 
private List<AssessmentText> texts = new LinkedList<>(); 

như bạn thấy có hai bộ sưu tập mà cần phải được nạp háo hức. Điều này không hoạt động và hibernate ném một ngoại lệ:

Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags 

Đó là vì Hibernate không thể tìm nạp nhiều bộ sưu tập với một lần. Nhưng nếu tôi thay đổi List thành SetLinkedList thành HashSet phần này hoạt động tốt nhưng vấn đề khác gây phiền nhiễu hơn xảy ra.

Khi tôi đang cố gắng để có được những thực thể từ cơ sở dữ liệu sử dụng:

entityManager.find(entityClass, primaryKey); 

Nó không thành công với:

org.hibernate.AssertionFailure: null identifier 

Tôi chắc chắn rằng ID tôi đi qua để find phương pháp không phải là null, Tôi đã sửa lỗi và tôi chắc chắn về điều này. Nó bằng cách nào đó biến mất bên trong Hibernate.

Nếu tôi thay đổi loại bộ sưu tập thành LAZY mọi thứ chỉ hoạt động mà không có lỗi nhưng có một số trường hợp tôi cần sử dụng EAGER.

Có ai có giải pháp cách khắc phục không? Hoặc tôi có thể có một bộ nhưng ngăn chặn lỗi khẳng định xảy ra hoặc tôi có thể có một danh sách nhưng bằng cách nào đó tránh nhiều lỗi lấy túi.

Tôi đang sử dụng:

Hibernate 4.2.2.Final 
Tomcat 7 
JPA 2.0 
JDK 1.7 

EDIT

Tôi vừa mới phát hiện ra rằng việc thêm @Fetch(FetchMode.SELECT) sửa chữa vấn đề này và tôi có thể sử dụng nhiều danh sách với EAGER loại, nhưng là có anyway để giải quyết việc này bằng cách không sử dụng chú thích cụ thể Hibernate? Và tại sao nó lại cố định vấn đề ngay từ đầu?

+1

Có một câu trả lời cho biết chính xác rằng ... bạn nên chấp nhận câu trả lời của mình ... chỉ cần nói. –

Trả lời

53

Nguyên nhân gốc của vấn đề là khi Hibernate lấy kết quả truy vấn SQL, không có cách nào đơn giản để cho biết phần tử con nào thuộc về bộ sưu tập nào. Xem this blog entry để được giải thích chi tiết hơn với ví dụ. Để tóm tắt bạn có cách giải quyết sau đây:

  • tải mỗi bộ sưu tập riêng biệt sử dụng subselect @Fetch(FetchMode.SELECT)
  • sử dụng quân của danh sách thay vì túi bằng cách thêm cột index @IndexColumn(name="LIST_INDEX")
  • Sử dụng bộ sưu tập có thứ tự như Set.
+7

Như tài liệu Hibernate nói (http://docs.jboss.org/hibernate/stable/orm/javadocs/org/hibernate/annotations/IndexColumn.html), @ IndexColumn không được chấp nhận. Tôi muốn recomment bằng cách sử dụng JPA's @ OrderColumn (http://docs.oracle.com/javaee/7/api/javax/persistence/OrderColumn.html). – russellhoff

12

Nếu bạn đang sử dụng Hibernate và bạn không quan tâm sử dụng các chú thích Hibernate:

Chú thích lĩnh vực bộ sưu tập của bạn với:

Hãy nhớ để loại bỏ các thuộc tính fetchType từ chú thích @OneToMany.

+2

Đây là chú thích cụ thể ngủ đông – Namphibian

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