3

休眠 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在成员集合上设置。
我可以使用原始对象,但我很好奇它是否可能。我也可以查询实体,但这似乎是在浪费资源。

4

1 回答 1

0

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

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

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

于 2012-08-28T17:42:57.603 回答