我有如下定义的一对多关系
@Cacheable
@Entity
@NamedEntityGraph(
name = "Parent.Child",
attributeNodes = {
@NamedAttributeNode("children"),
}
)
public class Parent {
private Set<Child> children;
// getter - setter
}
现在在我的DAL中,我正在调用此方法
@Override
public Parent getParentWithChildren(int id) {
EntityGraph<?> graph = entityManager.getEntityGraph("Parent.Child");
Map<String, Object> props = new HashMap<>();
props.put("javax.persistence.fetchgraph", graph);
return entityManager.find(Parent.class, id, props);
}
由于我已经加载了Parent with Children,我应该能够在事务之外使用 children 集合。但我得到 Lazyinitialization Exception 。只有在启用了休眠级别2缓存 - ehcache时才会发生这种情况。如果我从配置中禁用它,它按预期工作。此外,如果我在查找后明确初始化集合,它将按预期工作。这是一个错误吗?我使用Hibernate 5.2.6.Final和JPA 2.1。
编辑:我注意到的另一件事是第一次实体加载正常,所以这个问题必须与hibernate&amp;缓存提供商。
答案 0 :(得分:0)
没有。这不是一个错误。我想Hibernate会延迟从缓存加载,直到真的有必要。除非您要求提取,否则实现可能会认为是懒惰的。
因此,一般规则是在退出事务之前加载所需的所有内容(在准确关闭Hibernate会话之前)。