Hibernate не может одновременно получать несколько пакетов - PullRequest
405 голосов
/ 02 декабря 2010

Hibernate выдает это исключение при создании SessionFactory:

org.hibernate.loader.MultipleBagFetchException: невозможно одновременно получить несколько пакетов

Это мой тестовый пример:

Parent.java

@Entity
public Parent {

 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Long id;

 @OneToMany(mappedBy="parent", fetch=FetchType.EAGER)
 // @IndexColumn(name="INDEX_COL") if I had this the problem solve but I retrieve more children than I have, one child is null.
 private List<Child> children;

}

Child.java

@Entity
public Child {

 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Long id;

 @ManyToOne
 private Parent parent;

}

Как насчет этой проблемы? Что я могу сделать?


EDIT

ОК, у меня проблема в том, что внутри моего родителя находится другая «родительская» сущность, мое реальное поведение таково:

Parent.java

@Entity
public Parent {

 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Long id;

 @ManyToOne
 private AntoherParent anotherParent;

 @OneToMany(mappedBy="parent", fetch=FetchType.EAGER)
 private List<Child> children;

}

AnotherParent.java

@Entity
public AntoherParent {

 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Long id;

 @OneToMany(mappedBy="parent", fetch=FetchType.EAGER)
 private List<AnotherChild> anotherChildren;

}

Hibernate не любит две коллекции с FetchType.EAGER, но это похоже на ошибку, я не делаю необычных вещей ...

Удаление FetchType.EAGER из Parent или AnotherParent решает проблему, но мне это нужно, поэтому реальным решением является использование @LazyCollection(LazyCollectionOption.FALSE) вместо FetchType (благодаря Божо для раствор).

Ответы [ 12 ]

0 голосов
/ 12 января 2019

Для меня проблема заключалась в том, что вложенные поля EAGER извлекаются.

Одним из решений является установка для вложенных полей LAZY и использование Hibernate.initialize ()загрузить вложенное поле (поля):

x = session.get(ClassName.class, id);
Hibernate.initialize(x.getNestedField());
0 голосов
/ 14 июня 2017

Вы можете использовать новую аннотацию для решения этой проблемы:

@XXXToXXX(targetEntity = XXXX.class, fetch = FetchType.LAZY)

Фактически, значением по умолчанию для fetch также является FetchType.LAZY.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...