我有两个班级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
);
答案 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)默认为空