我有以下实体:
@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())。
除了深度复制之外没有解决方案吗?
答案 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实体调用更新功能。
希望它有所帮助。