hibernate 多对一删除的配置及问题

hibernate 多对一删除的配置及问题_第1张图片

KhXm.hbm.xml 考核项目的映射文件

    <id name="khXmId" type="java.lang.Integer">
<class name="com.gqb.dao.pojo.KhXm" table="kh_xm" catalog="kh">
    <id name="khXmId" type="java.lang.Integer">
        <column name="kh_xm_id" />
        <generator class="native" />
    </id>
    <property name="name" type="java.lang.String">
        <column name="name" length="1000" />
    </property>
    <property name="score" type="java.lang.Float">
        <column name="score" precision="5" scale="0" />
    </property>
    <property name="note" type="java.lang.String">
        <column name="note" length="500" />
    </property>
    <property name="year" type="java.lang.Integer">
        <column name="year" />
    </property>
    <many-to-one name="khDx" class="com.gqb.dao.pojo.KhDx" cascade="none" lazy="false" fetch="select">
        <column name="kh_dx_id" />
    </many-to-one>
   <!--  <property name="khDxId" type="java.lang.Integer">
        <column name="kh_dx_id" />
    </property> -->
    <property name="isCommon" type="java.lang.Integer">
        <column name="is_common" />
    </property>
    <property name="khDlId" type="java.lang.Integer">
        <column name="kh_dl_id" />
    </property>
    <property name="khFormId" type="java.lang.Integer">
        <column name="kh_form_id" />
    </property>
    <set name="khZbs" lazy="false" cascade="delete" inverse="true">
        <key column="kh_xm_id"></key>
        <one-to-many class="com.gqb.dao.pojo.KhZb"/>
    </set>
</class>

考核指标的映射文件 KhZb.hbm.xml

    <id name="khZbId" type="java.lang.Integer">
<class name="com.gqb.dao.pojo.KhZb" table="kh_zb" catalog="kh">
    <id name="khZbId" type="java.lang.Integer">
        <column name="kh_zb_id" />
        <generator class="native" />
    </id>
    <property name="name" type="java.lang.String">
        <column name="name" length="1000" />
    </property>
    <property name="khXmId" type="java.lang.Integer">
        <column name="kh_xm_id" />
    </property>
    <property name="score" type="java.lang.Float">
        <column name="score" precision="5" />
    </property>
    <property name="note" type="java.lang.String">
        <column name="note" length="500" />
    </property>
    <!-- <property name="deptId" type="java.lang.Integer">
        <column name="dept_id" />
    </property> -->
    <many-to-one name="deptId" lazy="false" cascade="delete"  fetch="select">
        <column name="dept_id"></column>
    </many-to-one>
    <property name="year" type="java.lang.Integer">
        <column name="year" />
    </property>
    <property name="khDxId" type="java.lang.Integer">
        <column name="kh_dx_id" />
    </property>

</class>

考核项目和考核指标是一对多的关系,在删除项目时必须要将指标一起删除或者将考核指标里的外键置为null或是0(推荐置为0,因为在mysql里,对字段为null的维护会带来额外的成本)
根据截图上的错误是在删除考核指标对象时,级联删除了考核指标的外键对应的类即考核对象,且外键为空,所以要将

       <many-to-one name="deptId" lazy="false" cascade="delete"  fetch="select">
        <column name="dept_id"></column>
    </many-to-one>

里面的 cascade=“delete”改为 cascade=“none” 即在删除多这一段的时候不进行级联操作,这样在级联删除考核指标时不会级联删除考核对象。
inverse 字段的配置,inverse的意思是对立面,反面的意思,所以可以很好的理解,当inverse=“true"是就是将关系交由对方来维护。

你可能感兴趣的:(hibernate 多对一删除的配置及问题)