Hibernate EntityManager 3.4.0或3.6.10
MyEntity {
@Id // NOT @GeneratedValue
long cislo;
@OneToMany( ... )
List<MyItem> items = new ArrayList();
public MyEntity( long cislo ) { this.cislo = cislo; }
...
}
然后,在DAO中:
MyEntity ent = new MyEntity( id );
ent.addItem( new Item( ... ) );
ent.addItem( new Item( ... ) );
ent = em.merge( ent );
1)为什么我需要使用merge()
,而不是persist()
会抱怨该实体已分离?是否由于手动设置ID?
2)为什么这个合并会在没有设置集合的情况下返回代理?
3)最重要的是:如何从merge()
获得完全初始化的实体?
除了在成员选择上设置EAGER
我可以使用原始对象,但我很好奇是否可能。
我也可以查询实体,但这似乎浪费了资源。
答案 0 :(得分:0)
1。)你为什么在这里使用“Session.merge()”? Merge通常用于将分离的实体实例重新附加到Hibernate / JPA会话 - 这通常发生在会话外部重用实体实例(例如,在视图层中)并且您希望将任何更改传播到这些实例时使用Session的数据库。
2。)Hibernate文档说“如果给定的实例未保存,请保存它的副本并将其作为新的持久化实例返回。” 在您的情况下,由于您正在尝试“合并”一个全新的实例,Hibernate将首先将其保存到数据库,然后将其重新获取为新的实体实例。返回代理的原因是因为Hibernate默认延迟加载任何Collection。为了确保集合的getter方法返回实际的集合。 Hibernate创建了一个代理。
3。)我很好奇你为什么不在这里使用Session.save()。