2011-09-19 77 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」時遇到了問題。 –