【发布时间】:2018-01-29 15:19:44
【问题描述】:
我在 Wildfly 9.0.1 中使用 java 批处理 (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
【问题讨论】:
-
“使用存储库获取”是什么意思?您的意思是从批处理作业存储库直接调用 jdbc 获取数据吗?
-
当我使用方法查询时没有问题。我在上面添加了完整的示例。
-
wildfly 9.0.1 使用 jberet 吗?
-
是的,WildFly 9 包含 JBeret 作为其批处理子系统提供程序。
-
表面上看起来像是 JPA / Hibernate 配置问题。你检查过AnserEntity 中的@OneToMany 注释,可能是CommentEntity 的集合关系字段吗?在那里您应该能够指定适当的提取类型。
标签: hibernate ejb wildfly-9 java-batch jberet