2012-12-03 65 views
0

我有一個JPA問題。將數據持久化到數據庫導致非法狀態異常

比方說,我有一個實體設置如下(只有一個假設)。

@Entity 
@Table (name = "TESTTABLE") 
public class TestTable { 

@Id 
@Basic (optional = false) 
private String id; 

@JoinColumn(name="TESTID", referencedColumnName = "ID") 
@OneToOne(optional = true) 
private TestTable testId; 

} 

基本上,
- = - = - = = --- ----
| TestTable的....... |
- = - = - = --- = ----
|字符串ID .......... | < ----------------------- |
|字符串testId .... | ----------- TestId = id |
- = - = - = - = - = - =

我在DB和,codewise設立foreign_key限制,我期待正常的「完整性約束違反 - 父鍵未找到「如果爲testId輸入的值在TestTable中沒有相應的id值,那麼返回約束(因此,如果我有的唯一條目是(1,null)和(2,1),(3,17)將導致失敗)。但是,當我嘗試將前面提到的(3,17)條目持久存儲到數據庫時,我得到一個IllegalStateException錯誤(因爲我沒有CascadeType.PERSIST,而且我試圖持久保留一個不會產生CascadeType.PERSIST的對象存在於數據庫中)。我知道這是預期的行爲,但無論如何繞過這一點,只是讓數據庫處理它(並因此返回預期的約束)?

謝謝。

+0

你能後你怎麼想堅持(3,17)?因爲要做到這一點,您需要首先獲取ID爲17的TestTable實體,然後將其設置爲ID爲3的新實體。 – Parvez

回答

0

只需在關係中使用級聯PERSIST。

在EclipseLink的你也可以使用持久性單元屬性,

"eclipselink.persistence-context.commit-without-persist-rules"="true" 
+0

cascade.PERSIST將不存在的實體添加到表中(所以現在有一個(3,17)和一個17,null))。我不希望這種情況發生。不幸的是,我認爲修改eclipseLink設置也是不可能的。 – nr2588

+0

所以,這是一個新的對象,但你不想堅持它?它從哪裏來的?您可以使用getReference()獲取對使用Id的現有對象的引用,如果該對象實際上不存在,則會導致您所需的約束錯誤。 – James

+0

這實質上是一個錯誤。無論是「跳槍」還是(17,1)在(3,1)存在或「打字」(3,17)時提供(3,17)。 – nr2588