Критерии гибернации: горячая загрузка коллекции ManyToMany - PullRequest
4 голосов
/ 06 января 2010

Моя проблема кажется мне довольно простой, но я просто не могу найти ответ, который работает. У меня есть Hibernate Entity, у которого есть связь ManyToMany с другой сущностью, которая по умолчанию лениво выбирается. Я хочу создать критерии, которые будут возвращать сущность с загруженной ассоциацией ManyToMany.

Вот сущность, о которой идет речь (с удаленными несущественными частями):

@Entity
public class Order {

  @ManyToMany
  private List<Item> items;

  @ManyToMany
  private List<Discount> discountEntries;

  ...

}

Вот мои известные попытки и результаты:

Criteria criteria = getSession().createCriteria(Order.class)
                                .setFetchMode("items", FetchMode.SELECT)
                                .setFetchMode("discountEntries", FetchMode.SELECT);
criteria.list();

- загружает предметы лениво

Criteria criteria = getSession().createCriteria(Order.class)
                                .setFetchMode("items", FetchMode.JOIN)
                                .setFetchMode("discountEntries", FetchMode.JOIN);
criteria.list();

- Невозможно получить несколько сумок

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();

- возвращает пустой список

РЕДАКТИРОВАТЬ: Добавлена ​​еще одна ассоциация ManyToMany, поскольку это, кажется, является частью проблемы.

Ответы [ 2 ]

2 голосов
/ 07 января 2010

Получить коллекцию с настройкой LAZY и:

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

Это инициализирует его немедленно, только для этого случая.

2 голосов
/ 06 января 2010

Вы пробовали: @ManyToMany(fetch = FetchType.EAGER)? какой был результат?

...