錯誤
Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
ORA-02291: 違反完整約束條件 (UNISPOWER.FK932556A9840256A3) - 未找到父項關鍵字
可能原因
表A中有個欄位是外鍵,關聯了表B中的某欄位,再往表A插入資料時,會出現這種情況。
可能原因:
1.在往A表插入時,外部索引鍵關聯的欄位在B表中必須有資料,如果B表中沒有資料則又這種情況。
2.產生了外鍵環,就是B表中被外部索引鍵關聯的欄位又關聯了C表中的欄位,而C中相應欄位卻沒有資料,則產生這種情況。
3.如果不是上兩種情況,那麼就是一個非常容易疏忽的問題:A中的外鍵欄位和B中的被外部索引鍵關聯欄位資料類型和長度不一致。特別是資料長度,必須要一致。
主表和從表中的資料類型的長度不一樣。
在Hibernate+spring下運行正常,到springRMI下有問題
Could not execute JDBC batch update; nested exception is
ORA-02291: 違反完整約束條件 (UNISPOWER.FK59EE1CFB72ACDA11) - 未找到父項關鍵字
我的原因:
由於映射實體類的配置對id屬性的設定一直是自動產生的。程式中有對id賦值的語句,導致插入表格時候的id值,和賦給下面關聯表格中的參考id值不一直。
就出現了上面的錯誤,因為substation表格中的id值是自動產生的,當然和程式中我賦值給的id值不同,後面的bay等又都是根據我程式中給的id值做參考外鍵。
這個問題真的是在網上找不到啊……
修改方法是將**.hbm.xml檔案中id設定屬性修改
<id
name="id"
column="SUBSTATION_ID"
type="java.lang.Long"
unsaved-value="-1"
>
<generator class="assigned">
</generator>
</id>
原來的generator一直是native這表示根據底層資料庫自動選擇適當的自動id建置原則
現在的assigned表示讓應用程式在調用save()之前為對象分配一個標示符。其實如果不指定generator預設就是這種。真的很白癡的問題啊!!
這個產生器使用一個自然鍵(natural key,有商業意義的列-譯註)作為主鍵,而不是使用一個代理鍵( surrogate key,沒有商業意義的列-譯註)。這是沒有指定 <generator> 元素時的預設行為。
【需要注意】當選擇 assigned 產生器時,除非有一個 version 或 timestamp 屬性,或者你定義
了 Interceptor.isUnsaved(),否則需要讓 Hiberante 使用 unsaved-value="undefined",強制
Hibernatet 查詢資料庫來確定一個執行個體是瞬時的(transient) 還是脫管的(detached)。
SPFILE 錯誤導致資料庫無法啟動(ORA-01565)
ORA-01172、ORA-01151錯誤處理
ORA-00600 [2662]錯誤解決