NamedEntityGraph - JPA / Hibernate throwing org.hibernate.loader.MultipleBagFetchException: cannot retrieve multiple packages at the same time

We have a project where we need to lazily upload collections of entities, but in some cases we need them, download them impatiently. We have added annotation @NamedEntityGraphto our essence. In our repository methods, we add the hint “javax.persistence.loadgraph” to eagerly load the 4 attributes defined in the specified annotation. When we call this request, Hibernate throws org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags.

It's funny when I redefine all these collections as impatiently taken Hibernate makes them look, without exception, a MultipleBagFetchException.

Here is the distilled code. An object:

@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);
}

, , ?

+4
1

, , , .

"" ( , ), sql, ( ), , "" . , org.hibernate.loader.MultipleBagFetchException, List , .

, , ( ) . Hibernate, , :

- , SQL. ; (), .

JIRA,

"" .

, , :

  • Set List
  • List, JPA 2 @OrderColumn,
  • , Hibernate (FetchMode.SELECT FetchMode.SUBSELECT)

:

+5

All Articles