我有一個使用Seam和JPA(Hibernate)持久化的對象模型。它看起來是這樣的:Seam/Hibernate/JPA - 重複主鍵異常?
@Entity(name = "MyObject")
public class MyObject {
...
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_myobj")
@SequenceGenerator(name = "seq_myobj", sequenceName = "seq_myobj")
private Long id = null;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, optional = false)
@NotNull
private MySubObject subObjA=null;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, optional = false)
@NotNull
private MySubObject subObjB=null;
...
}
@Entity(name = "MySubObject")
public class MySubObject {
...
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_mysubobj")
@SequenceGenerator(name = "seq_mysubobj", sequenceName = "seq_mysubobj")
private Long id = null;
}
我已經正確定義我@ManyToOne
註釋和一切。但是,如果我嘗試並堅持MyObject
(其中subObjA
和subObjB
都已設置)的實例,則會發生異常,說明我擁有子對象的重複主鍵之一。什麼會導致這種行爲?兩個對象都將其標識符類型設置爲SEQUENCE,如果我設置了其中一個,則沒有問題。只有當我將兩者都設置爲異常時。
我正在運行Seam 2.2,我的後端數據庫是PostgreSQL。有什麼想法可能會導致這種奇怪的行爲?我認爲這兩個對象都將作爲同一事務的一部分持續存在,並且將自動分配正確的主鍵。就像我說過的,如果我只設置其中一個對象,那麼就沒有問題。它只發生在我把它們都設置好的時候。任何幫助你可以給予很大的讚賞。
編輯但是,我注意到在測試各種事情時出現了一些奇怪的行爲。如果我以編程方式創建MyObject並設置其所有屬性(包括subObj),它仍然沒有問題。但是,如果我使用表單輸入屬性,則會出現錯誤。它可能與交易有關嗎?
您能向我們展示您應用的所有JPA批註嗎? – millhouse 2011-03-29 00:28:10
如果您在MySubObject類中重寫equals/hashCode,請告訴我們。 – 2011-03-29 11:16:45
編輯包含subObjA/B屬性的註釋 – Shadowman 2011-03-29 17:18:20