JPA - EntityGraph和Hibernate L2 Cache(ehcache)

时间:2017-01-10 06:42:01

标签: spring hibernate jpa ehcache

我有如下定义的一对多关系

@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;缓存提供商。

1 个答案:

答案 0 :(得分:0)

没有。这不是一个错误。我想Hibernate会延迟从缓存加载,直到真的有必要。除非您要求提取,否则实现可能会认为是懒惰的。

因此,一般规则是在退出事务之前加载所需的所有内容(在准确关闭Hibernate会话之前)。