2012-02-27 16 views
1

我有以下的(簡單)的映射:JPA(使用Hibernate)reatach現有實體在@OneToMany -

@Entity 
public class Role { 
    @OneToMany(fetch = FetchType.EAGER) private Set<Privilege> privileges; 
} 

我想做以下(簡化):

  • 我有創建一個Role(R1)與Privilege實體(P1)
  • 我想創建另一個新角色(R2),並給它相同的特權(P1)

因此,當創建新的R2時,它的特權集也是新的(HashSet不是PersistedSet),但它包含現有的P1;看來,Hibernate是無法認識到P1已經存在的事實並妥善持續的關係

我已經已經嘗試到以下幾點:

  • 保存新角色(R2)與兩個entityManager.persistentityManager.merge
  • 添加級聯= {CascadeType.ALL}對角色和特權
  • 之間的映射試圖預加載權限(以便在當前編碼擴頻通信存在實體離子)保存新角色

之前,我還沒有嘗試過(還):

  • 指定的映射
  • 手工做更多的操作@JoinColumn(name = "PRIV_ID")(如第一堅持空的角色實體他們更新權限) - 最後的手段

我在想這是一個非常標準的用例,所以也許我失去了一些東西,阻止我堅持這個協會公關operly。 任何想法? 謝謝。

回答

1

如果兩個角色可能具有相同的權限,那麼它不再是OneToMany,而是ManyToMany。因此,首先更改privileges集合的映射。

然後向我們展示將P1添加到R2的特權集的代碼。我懷疑你是在創建一個新的Privilege實例,而不是從會話中獲取P1。

0

OneToMany意味着特權具有反向鏈接(通過外鍵),並且它屬於一個且只有一個角色,並且不能屬於兩個。您需要多對多來實現您的目標

+0

雖然診斷是正確的,但解釋是錯誤的:OneToMany可以是單向的(因此,無後向鏈接),如果是,默認策略是使用連接表,就像一個多對多的關聯(但是有一個唯一的約束)。 – 2012-02-27 09:52:18

相關問題