ConstraintViolationException:使用Hibernate,列'PARENT_ID'不能为null

时间:2015-04-12 07:01:58

标签: hibernate

我有两个班级Parent和Child。子表有一个外键,它指的是Parent的主键。这是我的父类和子类的hibernate映射文件。当我尝试保存我的父对象时,我希望保存父对象中的父对象和子对象。但是当我尝试保存我的父对象时,我得到一个例外,

  

列'PARENT_ID'不能为空

请帮助我理解我做错了什么。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping default-lazy="false"
    package="com.customer.hibernate.mappings" catalog="customer">
    <class name="Child" table="child_table">
        <id name="childId" type="java.lang.Integer">
            <column name="CHILD_ID" />
            <generator class="identity" />
        </id>
        <property name="childName" type="string">
            <column name="CHILD_NAME" />
        </property>     
        <many-to-one name="parent" class="Parent"
            fetch="select">
            <column name="PARENT_ID"/>
        </many-to-one>      
    </class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping default-lazy="false"
    package="com.customer.hibernate.mappings" catalog="customer">
    <class name="PARENT" table="parent_table">
        <id name="parentId" type="java.lang.Integer">
            <column name="PARENT_ID" />
            <generator class="identity" />
        </id>
        <property name="parentName" type="string">
            <column name="PARENT_NAME" />
        </property>     
        <set name="child" cascade="all"
            table="child_table" fetch="select" inverse="false">
            <key>
                <column name="PARENT_ID"/>
            </key>
            <one-to-many class="Child"/>
        </set>          
    </class>
</hibernate-mapping>

以下是我的数据库表。

CREATE TABLE `customer`.`parent_table` 
  ( 
     `PARENT_ID`   INT(11) NOT NULL auto_increment, 
     `PARENT_NAME` VARCHAR(255) DEFAULT NULL, 
     PRIMARY KEY(`PARENT_ID`) 
  );  

CREATE TABLE `customer`.`child_table` 
  ( 
     `CHILD_ID`   INT(11) NOT NULL auto_increment, 
     `CHILD_NAME` VARCHAR(255) DEFAULT NULL, 
     `PARENT_ID`  INT(11) NOT NULL, 
     PRIMARY KEY (`CHILD_ID`), 
     CONSTRAINT `fk_childs_parent_id` FOREIGN KEY (`PARENT_ID`)REFERENCES 
     `customer`.`parent_table` (`PARENT_ID`)ON DELETE no action ON UPDATE no 
     action 
  ); 

3 个答案:

答案 0 :(得分:0)

<many-to-one name="parent" class="Parent" cascade="save-update" fetch="select">
<one-to-many class="Child" inverse="true"/>

答案 1 :(得分:0)

感谢Andy Ying的建议。子表中的外键不为null。我通过在parent.hbm.xml中添加如下所示的not-null =“true”解决了我的问题。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD   3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-lazy="false"
package="com.customer.hibernate.mappings" catalog="customer">
<class name="PARENT" table="parent_table">
    <id name="parentId" type="java.lang.Integer">
        <column name="PARENT_ID" />
        <generator class="identity" />
    </id>
    <property name="parentName" type="string">
        <column name="PARENT_NAME" />
    </property>     
    <set name="child" cascade="all"
        table="child_table" fetch="select" inverse="false">
        <key not-null="true">
            <column name="PARENT_ID"/>
        </key>
        <one-to-many class="Child"/>
    </set>          
</class>

答案 2 :(得分:0)

除了在映射侧添加了null(hibernate.xml)外,我与Toni相同,我在数据库表级别将其子表Parent_ID更改为 来自

  

PARENT_ID INT(11)不为空,

  

PARENT_ID INT(11)默认为空