Hibernate中hbm文件有关Set一对多级联

今日在项目中,遇到一个让人头疼的问题。问题涉及到两个存在级联关系的两张表 T_CONSTRUCT_OPERATION(主表)和 T_CONSTRUCT_PRACTI(子表)。

CREATE TABLE T_CONSTRUCT_OPERATION{
     CONSTRUCT_ID BIGINT IDENTITY PRIMARY KEY          -- 主表ID(主键)
}
<pre name="code" class="sql">CREATE TABLE T_CONSTRUCT_PRACTI{
     CONSTRUCT_PRACTI_ID BIGINT IDENTITY PRIMARY KEY,  -- 子表ID(主键)
     CONSTRUCT_ID BIGINT NOT NULL                      -- 主表ID
}
      
T_CONSTRUCT_OPERATION 表hbm文件片段: 
        <set name="constructRealPractiSet" lazy="true" cascade="all" inverse="false"
             where = "TYPE = '1' "  >
            <key column="CONSTRUCT_ID" />
            <one-to-many class="com.knight.emms.model.ConstructPracti" />
        </set>
级联策略 cascade="all":所有情况下均进行级联操作

    然而当对主表持久化对象进行update或merge操作时,总是会报

     org.hibernate.util.JDBCExceptionReporter(JDBCExceptionReporter.java:234) - 不能将值 NULL 插入列 'CONSTRUCT_ID',表                             'EMMS.dbo.T_CONSTRUCT_PRACTI';列不允许有 Null 值。UPDATE 失败。

    查看hibernate执行的SQL语句:

<pre name="code" class="sql">Hibernate: insert into T_CONSTRUCT_OPERATION_TASK (CONSTRUCT_ID, CONTENTS, UNIT, TASK_TYPE, QUANTITY, UNIT_PRICE, SUMMARY, REMARK) values (?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into T_CONSTRUCT_PRACTI (CONSTRUCT_ID, USER_ID, TYPE) values (?, ?, ?)
Hibernate: update T_CONSTRUCT_OPERATION_TASK set CONSTRUCT_ID=?, CONTENTS=?, UNIT=?, TASK_TYPE=?, QUANTITY=?, UNIT_PRICE=?, SUMMARY=?, REMARK=? where CONSTRUCT_TASK_ID=?
Hibernate: update T_CONSTRUCT_OPERATION_TASK set CONSTRUCT_ID=null where CONSTRUCT_ID=?
Hibernate: update T_CONSTRUCT_OPERATION_TASK set CONSTRUCT_ID=null where CONSTRUCT_ID=?
Hibernate: update T_CONSTRUCT_OPERATION_TASK set CONSTRUCT_ID=? where CONSTRUCT_TASK_ID=?
Hibernate: update T_CONSTRUCT_OPERATION_TASK set CONSTRUCT_ID=? where CONSTRUCT_TASK_ID=?
 
     发现原来hibernate在处理一对多的级联关系的时候,如果需要对子表进行update修改数据,hibernate最后总会将子表中所有与主表关联的条目的关联ID置空,删除主从表之间的关联关系,然后再重新关联一次。 

     以保证数据库的关联数据与session中的保持一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值