object references an unsaved transient instance - save the transient instance before flushing

本文介绍在使用Hibernate框架进行多对一映射时遇到的“objectreferencesanunsavedtransientinstance”异常及其解决方案,包括正确的插入顺序和配置映射文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用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>



注意红色的位置:是表明多对一映射的时候,执行的顺序,先新增,后修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值