2014-09-26 55 views
0

我有以下实体:Hibernate试图去挽救一个分离的实体 - LazyInitializationException中

@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); 
    } 
} 

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

问题与this (old) thread差不多。 但在我的情况下没有任何建议(尝试em.flush(),em.detach(),session.evict())。

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

回答

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实体调用更新函数。

希望它有帮助。

+0

抓取不是问题 - 我正在读取所有的c(加载后调用cList.size())。否则,在渲染组件以编辑c的属性时会发生错误。 Again:我有我需要的任何东西在我的托管bean中,需要修改它,但我不想保存它(休眠似乎尝试) – 2014-10-02 10:37:51

+0

您是否检查过您的对象是否真的在托管bean中分离?这里是你如何检查http://stackoverflow.com/questions/19474399/how-to-identify-an-object-is-transient-or-detached-in-hibernate – 2014-10-03 08:06:52

相关问题