2011-09-19 34 views
1

一个现有的对象我有2个对象如下克隆一个新的主键

class A{ 
Set<B> bs ; 

} 

class B{ 
A a; 

} 

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

例如,如果初始A id为1,并且与5分B s之关联,然后我的代码执行后,我想2个A s的ID = 1,2和10 B秒(5 A1和5对于A2)。

我尝试以下操作:

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小号染具有同样的老插入时的编号为A

注意:我正在使用HBM文件而不是JPA。

+0

@Akhsay,什么是级联(从一个到多个一对多)设置为? – Santosh

+0

同时查看这个传递持久性链接(http://docs.jboss.org/hibernate/stable/core/reference/en-US/html/objectstate.html#objectstate-transitive)。这可能会帮助你。 – Santosh

回答

1

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

请您分离对象并保存,otherwize请使用合并。

你可以在这里阅读更多的ABOT合并:

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

+0

@all:谢谢,通过分离解决了问题 – Akshay

1

假设没有B S'性质的需要任何独特性,你应该卸下所有B对象(也许这些会得到分离过,当你脱离A),并在每个B对象的改变A值 - 分配分离的A

0

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

0

这是我对这个。

  1. JVM中对象的标识与其在数据库中的标识不同。检查this链接..
  2. 即使您更改了主键,对象引用仍然是相同的。所以会话缓存不能有一个它已经拥有的对象的引用(即使你已经改变了它的ID)。
  3. 您将不得不创建一个新的对象(瞬态)对象来实现您正在尝试执行的操作,或者不要让Hibernate管理您的身份。自己做。检查提到的earlier link

也查看此链接transitive persistence。这可能会帮助你。

+0

他表示他让对象成为“瞬态”。 –

+0

@Adeel,引用Hibernate doc“如果一个对象刚刚使用new运算符实例化,并且与Hibernate Session没有关联,则它是暂时的,它在数据库中没有持久表示,并且没有指定标识符值” 。请参阅链接http://docs.jboss.org/hibernate/core/3.3/reference/en/html/objectstate.html。 Akshay没有显示他所做的并且反应过渡的代码,你可以分离一个对象,但不知道你是如何使它瞬变的。 – Santosh

+0

通过使它成为'瞬态',他意味着分离。这里“分离”的对象就足够了。您可以尝试打印“管理”和“分离”对象的引用,您将看到两个不同的引用。从他发布的错误看来,他在收集“B”时遇到了问题。 –