Hibernate / JPA:em.merge(new MyEntity(id))返回没有集合的代理

时间:2012-07-22 01:26:37

标签: hibernate jpa merge

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     我可以使用原始对象,但我很好奇是否可能。     我也可以查询实体,但这似乎浪费了资源。

1 个答案:

答案 0 :(得分:0)

1。)你为什么在这里使用“Session.merge()”? Merge通常用于将分离的实体实例重新附加到Hibernate / JPA会话 - 这通常发生在会话外部重用实体实例(例如,在视图层中)并且您希望将任何更改传播到这些实例时使用Session的数据库。

2。)Hibernate文档说“如果给定的实例未保存,请保存它的副本并将其作为新的持久化实例返回。”     在您的情况下,由于您正在尝试“合并”一个全新的实例,Hibernate将首先将其保存到数据库,然后将其重新获取为新的实体实例。返回代理的原因是因为Hibernate默认延迟加载任何Collection。为了确保集合的getter方法返回实际的集合。 Hibernate创建了一个代理。

3。)我很好奇你为什么不在这里使用Session.save()。