OneToMany LazyInitializationException, когда коллекция пуста - PullRequest
0 голосов
/ 12 марта 2019

Я знаю, что есть десятки вопросов на ту же тему, но я не могу понять, почему они не работают в моем случае.

У меня есть две таблицы, одна с именем Account и одна с CustomerRelations, и между ними существует соотношение один ко многим (к одной учетной записи может принадлежать несколько customerRelations ... учетная запись может существовать без других отношений с клиентами но связь с клиентом может быть привязана только к существующей учетной записи)

Вот как они аннотируются в моих классах сущностей:

Таблица счетов:

@OneToMany(mappedBy = "account", cascade = CascadeType.ALL, orphanRemoval = true)
@OnDelete(action = OnDeleteAction.CASCADE)
private List<CustomRel> customRels = new ArrayList<>();

Таблица CustomerRelation:

@ManyToOne(fetch = FetchType.EAGER)
private Account account;

У меня есть бизнес-логика, в которой я хочу вызвать запрос, основанный на конкретной дате, сохраненной на вкладке Учетная запись:

@NamedQuery(name = Account.FIND_BY_ACC_NBR, query = "select acc from Account acc where acc.accountNumber =:accountNumber")

Этот запрос дает правильные данные из таблицы счетов, но для поля customerRels я получаю следующее исключение:

**Unable to evaluate the expression Method threw 'org.hibernate.LazyInitializationException' exception.**

То же самое происходит, когда метод get вызывается для моего объекта Account:

enter image description here

В моем примере есть объект account с пустым списком customerRels. Таким образом, в базе данных нет записи customerRels, которая связана с accountId.

Насколько я знаю, что fetchType в моем классе сущностей Account в lazy - по умолчанию, верно?.

В моих сценариях SQL, которые создают таблицы, в таблицу CustomerRelations добавлен только account_id, в таблице Account нет ссылки на дочерний объект.

Я знаю, что это очень банальная проблема, но мне нужна помощь. Должен ли я изменить свой запрос JPQL?

1 Ответ

2 голосов
/ 12 марта 2019

OneToMany - это LAZY по умолчанию, и вы получаете доступ к коллекции вне сеанса гибернации (выполняющейся транзакции).Даже список пуст, выбор необходим для инициализации отложенной коллекции.Постоянство не может знать, есть ли элементы в коллекции, если оно не проверяет в БД.

опции:

  1. FetchType.EAGER
  2. join fetch rels r в вашем JPQL
  3. инициализация коллекции внутри транзакции / сеанса
...