Hibernate试图保存一个分离的实体--LazyInitializationException

时间:2014-09-26 07:28:52

标签: java hibernate jpa

我有以下实体:

@Entity
public class B{

   @OneToMany
   private List<C> cList;

   private Long d;

}

在我的托管bean中,我需要加载一个特定的b(完全正常)才能编辑包含的属性(cList,d):

@ManagedBean
public class Bean{

   private B b;

   public void onEvent(Long bId){
      b = bManager.load(bId);
   }
}

必须使用JSF-Form编辑B的属性。我不希望这些更改反映到数据库中。

问题与this (old) thread中的问题非常相似。 但在我的案例中没有提出任何建议(尝试了em.flush(),em.detach(),session.evict())。

除了深度复制之外没有解决方案吗?

1 个答案:

答案 0 :(得分:0)

可以这样做,但首先要知道hibernate正在做什么以及为什么会遇到异常。 Here is documentation about object states

如果要访问包含对象C的列表,或者要修改其中一些列表,则必须在它到达托管bean之前获取它。默认情况下,hibernate提取对象是懒惰的,并且在访问它们时将加载相关对象,但前提条件是将事务和会话附加到对象。因此,在您的托管bean中,对象是分离的,并且当时无法获取C列表。要解决该问题,您必须在到达托管bean之前获取要更改的所有对象。即

   @OneToMany
   @Fetch(FetchMode.JOIN)              // load it with sql join
   private List<C> cList;   

还有很多其他方法可以达到相同的效果。所以现在你可以更新你的B和C列表 实体,然后为您的B实体调用更新功能。

希望它有所帮助。