在使用hibernate的时候,难免会出现多对一,或者一对多,多对多等情况,也极容易出现:object references an unsaved transient instance - save the transient instance before flushing这个异常错误,原因就是:存在主外键的约束,先执行了子表的新增,后执行了主表的新增,这时就会存在问题。
例如:
UserEntity model=new UserEntity();
model.setName("测试128");//用户名
model.setSex(1);
DepEntity dep=new DepEntity();
dep.setDepname("行政部");//部门
model.setDepEntity(dep);
这个时候,如果先插入用户表的时候,则会出现上述错误,因为没有外键,外键为空还没有生成。
解决方案:
1、先插入外键对应的表,也就是部门,再进行用户表的插入
2、直接在hibernate映射文件进行配置:
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.fei.shop.Model.UserEntity" table="User" schema="shop"> <id name="id" type="java.lang.Integer"> <generator class="native"></generator> </id> <property name="name"> <column name="name" sql-type="varchar(200)" length="200"/> </property> <property name="sex"> <column name="sex" sql-type="int(11)"/> </property> <!--多对一, 一个部门下多个人--> <many-to-one name="depEntity" class="com.fei.shop.Model.DepEntity" column="depid" cascade="save-update,persist"></many-to-one> </class> </hibernate-mapping>
注意红色的位置:是表明多对一映射的时候,执行的顺序,先新增,后修改