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 Set
và LinkedList
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?
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. –