【问题标题】:Hibernate trying to save a detached entity - LazyInitializationExceptionHibernate 尝试保存分离的实体 - LazyInitializationException
【发布时间】:2014-11-21 03:38:44
【问题描述】:

我有以下实体:

@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())。

除了深拷贝没有别的办法了吗?

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    这是可能的,但首先最好知道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 实体调用更新函数。

    希望对你有帮助。

    【讨论】:

    • 获取不是问题 - 我正在获取所有 c(加载后调用 cList.size())。否则,在渲染组件以编辑 c 的属性时会发生错误。再说一遍:我在我的托管 bean 中任何我需要的东西,需要修改它,但我不想保存它(hibernate 似乎在尝试)
    • 您是否检查过您的对象是否真的在托管 bean 中分离?这是您如何检查stackoverflow.com/questions/19474399/…的示例
    猜你喜欢
    • 2020-04-04
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 2014-09-05
    • 2013-09-30
    • 2018-07-03
    相关资源
    最近更新 更多