Hibernate Criteria: Eagerly load ManyToMany collection

criteria, fetch, hibernate

Solution

Get the collection with the `LAZY` setting and :

List list = criteria.list();
Hibernate.initialize(list);

This will initialize it immediately, only for this case.

Problem

My problem seems pretty straightforward to me, but I just can't seem to find an answer that works. I have a Hibernate Entity which has a ManyToMany association with another Entity, which is fetched lazily by default. I want to create a Criteria which will return the Entity with the ManyToMany association loaded eagerly. Here is the Entity in question (with irrelevant parts removed): ``` @Entity public class Order { @ManyToMany private List<Item> items; @ManyToMany private List<Discount> discountEntries; ... } ``` Here are my notable attempts thus far and the results: ``` Criteria criteria = getSession().createCriteria(Order.class) .setFetchMode("items", FetchMode.SELECT) .setFetchMode("discountEntries", FetchMode.SELECT); criteria.list(); ``` - Loads the items lazily ``` Criteria criteria = getSession().createCriteria(Order.class) .setFetchMode("items", FetchMode.JOIN) .setFetchMode("discountEntries", FetchMode.JOIN); criteria.list(); ``` - Cannot fetch multiple bags ``` Criteria criteria = getSession().createCriteria(Order.class) .createAlias("items", "items", CriteriaSpecification.INNER_JOIN) .setFetchMode("items", FetchMode.JOIN) .createAlias("discountEntries", "discountEntries", CriteriaSpecification.INNER_JOIN) .setFetchMode("discountEntries", FetchMode.JOIN); criteria.list(); ``` - Returns an empty list EDIT: Added another ManyToMany association as that seems to be part of the problem.

Original source