使用新主键克隆现有对象

时间:2011-09-19 09:20:13

标签: java hibernate

我有2个对象如下

class A{
 Set<B>  bs ;

}

class B{
 A a;

}

现在,我想找到id为1的A并插入id为2的新记录,其他所有值都相同。还应该重新插入与B相关联的A

例如,如果初始A标识为1,并且与B s关联,那么在我的代码执行后,我想要2 A个id = 1和2和10 B s(A1为5,A2为5)。

我试过以下:

    stat tx
    A a= Find A with id a 
    make a transient 
    a.setId(null) ;  As id is auto incremnt
    persist A
    commit tx

我的异常是

  

找到两个相同集合B的表示。

我认为这是因为B在插入

时具有相同的旧{id} {id}

注意:我使用的是HBM文件,而不是JPA。

4 个答案:

答案 0 :(得分:1)

假设B s'属性都不需要任何唯一性,你应该分离所有B个对象(当你分离A时,也可能会分离这些对象)并更改每个A对象下的B值 - 指定分离的A

答案 1 :(得分:1)

这是正确的,因为你不能在同一个会话中有2个重复的对象。

请你分离对象并保存,另外请使用merge。

你可以在这里阅读更多abot merge:

http://www.hibernate-training-guide.com/merge.html

答案 2 :(得分:0)

我会使用BeanUtils.copyProperties(..)复制实体。然后将ID设置为null。

答案 3 :(得分:0)

以下是我对此的看法。

  1. JVM中对象的标识与其在Database中的标识不同。查看this链接..
  2. 即使您更改了主键,对象引用仍然是相同的。因此,Session缓存不能具有已有的对象的引用(即使您已更改其id)。
  3. 您必须创建一个新对象(瞬态)对象才能实现您想要做的事情,或者不要让Hibernate管理您的身份。自己做。检查提到的earlier link
  4. 另请查看transitive persistence的此链接。这可能会帮助你。