实体从阅读器

时间:2018-01-29 15:19:44

标签: hibernate ejb wildfly-9 java-batch jberet

我在wildfly 9.0.1中使用java batch(jsr-352)。步骤(基于块)访问实体的惰性字段的处理器。当处理器想要获取惰性字段时,我给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 个答案:

答案 0 :(得分:0)

我假设您使用JPA来获取您的实体。显然,加载评论的PersistenceContext在访问评论时不再可用,因此会出现该异常。

作为解决方案,您必须在与核心实体字段相同的上下文中加载注释。我看到了这些可能性:

  1. 检查是否可以增加持久性上下文的范围。在所有事务都遍历每个块的读取器,处理器和写入器之后,PersistenceContext可能有类似的可能。
  2. 即使声明您的实体是延迟获取的,您也可以覆盖该查询的设置,也可以通过在阅读器中对其进行访问来显式加载注释字段。这会使延迟加载无效,但肯定会起作用。如果有时仅需要该字段,则可能是一个惩罚。
  3. 最后一种可能性是将所有其他数据加载到处理器的PersistenceContext中,这是您已经评估的。优点是它肯定有效,并且不会失去延迟加载的优点。