合并后读取的集合上的LazyInitializationException

时间:2012-04-16 16:00:31

标签: hibernate

我正在将一个Eclipselink应用程序转换为使用与JBoss 6捆绑在一起的Hibernate 3.6,并且需要修改延迟加载是如何完成的。这不是我第一次使用hibernate。

然而,在合并完成后,我的集合似乎变得未初始化。我不记得以前见过这种行为。例如:

Entity entity = entityDAO.getEntity(id);
System.out.println(entity.getMyCollection().size()); // OK, no exception
entity = entityDAO.update(entity);
System.out.println(entity.getMyCollection().size()); // Throws LazyInitializationException 

EntityDAO代码段:

public Entity getEntity(Long id){
    Entity e = entityManager.find(Entity.class, id);
    Hibernate.initialize(e.getMyCollection());
    return e;
}

public Entity update(Entity entity){
    return entityManager.merge(entity);
}

实体代码段:

@OneToMany(mappedBy="entity", cascade=CascadeType.ALL, orphanRemoval=true)
private List<AnotherEntity> myCollection = new ArrayList<AnotherEntity>();

这真的是预期的行为吗? hibernate在合并期间会丢弃数据似乎很奇怪。

1 个答案:

答案 0 :(得分:2)

这确实是预期的行为。 merge()包含在

  • 获取与作为参数传递的分离ID具有相同ID的实体
  • 将分离的实体的状态复制到附加的实体
  • 并返回附加实体

因此,显然,如果不重新初始化返回的附加实体的延迟集合,则不会加载该集合。

相关问题