ORA-02291: 違反完整約束條件 …… - 未找到父項關鍵字

來源:互聯網
上載者:User

錯誤
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]錯誤解決

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.