2011-05-04 80 views
0

我在Person和他們的父母/子女(也是Person的實例)之間存在以下非常簡單的多對一關係。HibernateException:外鍵可能不爲空

Person.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated 04.05.2011 15:02:31 by Hibernate Tools 3.3.0.GA --> 
<hibernate-mapping> 
    <class name="test.Person" table="PERSONS"> 

     <id name="id" type="long" access="field"> 
      <column name="PERSON_ID" /> 
      <generator class="native" /> 
     </id> 

     <bag name="children" table="PERSONS" lazy="false" inverse="true" cascade="all"> 
      <key column="PERSON_ID" not-null="false"></key> 
      <one-to-many class="test.Person" /> 
     </bag> 

     <many-to-one name="parent" column="PARENT_ID" not-null="false" /> 

    </class> 
</hibernate-mapping> 

現在,在我的情況下,問題是,我有沒有父母(如孤兒)人員的實例。

如果我試圖堅持這些對象,我得到:

值java.sql.SQLException:空,消息 從服務器: 「列 'PARENT_ID' 不能爲空」

如果我在映射文件中設置not-null="true",我得到:

org.hibernate.PropertyValueException: 不是空屬性引用null或 瞬態值:test.parent

這裏有什麼魔術?

+0

第一個錯誤消息來自服務器,而不是Hibernate。你確定PARENT_ID在數據庫表中是可以空的嗎? – 2011-05-04 14:26:59

+0

如果您從'bag'鍵中移除'not-null =「false」',該怎麼辦?我有相同的環境,但用'list'而不是'bag' – jotapdiez 2011-05-04 14:29:45

+0

@Ben Hoffstein \t 我使用MySQL。我讓Hibernate通過設置創建 Timo 2011-05-04 14:47:30

回答

1

Valmar,由於您正在獲取SQL異常,因此您的COLUMN'PARENT_ID'可能具有非空約束。檢查你的表DDL。你使用的是哪個數據庫?

+0

我使用MySQL。我讓Hibernate通過設置' create''爲我自動創建表格。 – Timo 2011-05-04 14:47:06

+0

不過,你可以檢查MySQL中的表格定義,看看Hibernate是否準確地生成一個可爲空的列? – 2011-05-04 14:49:04

+0

我刪除了所有表並讓Hibernate重新創建它們。現在這些列似乎是空的,但我得到一個新的異常:'java.sql.SQLException:null,來自服務器的消息:「無法添加或更新子行:外鍵約束失敗(miydyd/PERSONS',CONSTRAINT' FK5A63FB1DE1B4BCAD'外鍵('PERSON_ID')參考文獻'PERSONS'('PERSON_ID'))「' – Timo 2011-05-04 14:55:22