【发布时间】:2017-01-10 06:42:00
【问题描述】:
我有如下定义的一对多关系
@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 加载了 Children,我应该能够在事务之外使用 children 集合。但我得到延迟初始化异常。仅当启用休眠 2 级缓存 - ehcache 时才会发生这种情况。如果我从配置中禁用它,它会按预期工作。此外,如果我在 find 之后显式初始化集合,它会按预期工作。那么它是一个错误吗?我正在使用 Hibernate 5.2.6.Final 和 JPA 2.1。
编辑:我注意到的另一件事是实体第一次加载正常,因此该问题必须与休眠和缓存提供程序有关。
【问题讨论】:
-
我也遇到过类似的情况。我不使用二级缓存。我意识到,如果实体已经在持久性上下文中,则带有 fetchgraph 提示的下一个 em.find 不会从数据库中加载任何内容。在我看来,这也是错误。
-
我认为会话缓存也会发生同样的情况。这是一个已确认的错误,并标记为在 5.2.10 中解决
标签: spring hibernate jpa ehcache