LazyInitializationException, когда объект передается процессору из считывателя

Я использую Java-пакет (JSR-352) в Wildfly 9.0.1. Процессор пошагового (на основе чанка) доступа к ленивому полю сущности. Когда процессор хочет получить ленивое поле, я даю LazyInitializationException, Когда я запускаю его на wildfly 11.0.0.Alpha1, все работает нормально. В wildfly 9.0.1 при извлечении этого поля из репозитория проблем не возникает. Как я могу сделать это без использования хранилища?

читатель:

public Object readItem() {
   return answerRepository.findBy(23);
}

процессор:

public Object processItem(Object item) {
   AnswerEntitiy answerEntitiy = (AnswerEntitiy)item;
   //when i call answerEntitiy.getComment() LazyInitializationException throws
   return commentRepository.findByAnswer(answerEntitiy); //works fine
}

автор:

public void writeItems(List<Object> items) {
    //loops and casting
    commentRepository.save(comment); //LazyInitializationException
}

Вот полная ошибка:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.test.AnswerEntitiy.comments, could not initialize proxy - no Session

1 ответ

Я предполагаю, что вы используете JPA для получения ваших сущностей. По-видимому, PersistenceContext, который загрузил ваш вопрос, больше не доступен к тому времени, когда вы получаете доступ к комментарию, поэтому вы получаете это исключение.

В качестве решения вы должны загрузить комментарий в том же контексте, что и основные поля сущности. Я вижу эти возможности:

  1. проверьте, можете ли вы увеличить объем контекста сохранения. После того, как все транзакции охватывают чтение, обработку и запись для каждого фрагмента, возможно, что-то подобное возможно для PersistenceContext.
  2. Даже если ваша сущность объявлена ​​ленивой, вы можете либо переопределить этот параметр для запроса, либо явным образом загрузить поле комментария, обратившись к нему в средстве чтения. Это делает ленивую загрузку недействительной, но определенно сработает. Это может быть штрафом, если поле нужно только иногда.
  3. Последняя возможность — загрузить все дополнительные данные в PersistenceContext процессора, что вы уже оценили. Преимущество в том, что он определенно работает и не теряет преимуществ ленивой загрузки.
Другие вопросы по тегам