我們有一個項目,我們需要延遲加載一個實體的集合,但在某些情況下,我們需要它們急切地加載。我們已經爲我們的實體添加了一個@NamedEntityGraph
註釋。在我們的倉庫方法中,我們添加一個「javax.persistence.loadgraph」提示,以便加載所述註釋中定義的4個屬性。當我們調用這個查詢時,Hibernate會拋出org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
。NamedEntityGraph - JPA/Hibernate拋出org.hibernate.loader.MultipleBagFetchException:不能同時獲取多個包
有趣的是,當我將所有這些集合重新定義爲渴望獲取時,Hibernate 確實會爲它們提供熱線而沒有MultipleBagFetchException。
這是蒸餾代碼。 實體:
@Entity
@NamedEntityGraph(name = "Post.Full", attributeNodes = {
@NamedAttributeNode("comments"),
@NamedAttributeNode("plusoners"),
@NamedAttributeNode("sharedWith")
}
)
public class Post {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "postId")
private List<Comment> comments;
@ElementCollection
@CollectionTable(name="post_plusoners")
private List<PostRelatedPerson> plusoners;
@ElementCollection
@CollectionTable(name="post_shared_with")
private List<PostRelatedPerson> sharedWith;
}
查詢方法(全部擁擠在一起,使其可發佈):
@Override
public Page<Post> findFullPosts(Specification<Post> spec, Pageable pageable) {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Post> query = builder.createQuery(Post.class);
Root<Post> post = query.from(Post.class);
Predicate postsPredicate = spec.toPredicate(post, query, builder);
query.where(postsPredicate);
EntityGraph<?> entityGraph = entityManager.createEntityGraph("PlusPost.Full");
TypedQuery<GooglePlusFullPost> typedQuery = entityManager.createQuery(query);
typedQuery.setHint("javax.persistence.loadgraph", entityGraph);
query.setFirstResult(pageable.getOffset());
query.setMaxResults(pageable.getPageSize());
Long total = QueryUtils.executeCountQuery(getPostCountQuery(specification));
List<P> resultList = total > pageable.getOffset() ? query.getResultList() : Collections.<P>emptyList();
return new PageImpl<P>(resultList, pageable, total);
}
爲什麼是這對實體層面渴望回遷工作的任何提示,但不能與動態的實體圖形?