0

私の問題は、親を削除すると、子は削除されませんが、子を削除する代わりに、子が更新されます。親テーブルEmployeeと子テーブルEmployeeProjectには、従業員とプロジェクトの間に1対多の関係が存在します。1人の従業員が多くのプロジェクトを持っていました。私はこれがコンソールに表示されているクエリであると誤解している場所を確認してください

Hibernate: update employee_project set employeeNumber=null where employeeNumber=?
Hibernate: delete from employee where EMPLOYEE_NUMBER=?

これが削除のロジックです

 public boolean deleteEmployee(Employee employee) {
        Transaction transaction = null;
        boolean flag;
        try {
            transaction = session.beginTransaction();
            session.delete(employee);
            transaction.commit();
            flag = true;
        } catch (HibernateException exception) {
            if (transaction != null)
                transaction.rollback();
            flag = false;
        }
        return flag;
    }

これは、親テーブル マッピング ファイル Employee.hbm.xml です。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.nousinfo.tutorial.model">
    <class name="Employee" table="employee">
        <meta attribute="class-description">
            This class contains the employee detail
        </meta>
        <id name="employeeNumber" type="int" column="EMPLOYEE_NUMBER">

        </id>
        <property name="firstName" type="string" column="FIRST_NAME"></property>
        <property name="lastName" type="string" column="LAST_NAME"></property>
        <set name="employeeProjects" cascade="all-delete-orphan" lazy="false"
            inverse="true">
            <key column="employeeNumber" />
            <one-to-many class="com.nousinfo.tutorial.model.EmployeeProject" />
        </set>
        <property name="address1" type="string" column="ADDRESS_1"></property>

    </class>

</hibernate-mapping>

これは、子テーブル マッピング ファイル project.hbm.xml です。

 <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.nousinfo.tutorial.model">
    <class name="EmployeeProject" table="employee_project">
        <meta attribute="class-description">
            This class contains the employee detail
        </meta>
        <composite-id>
            <key-property name="employeeNumber" type="int"
                column="EMPLOYEE_NUMBER"></key-property>
            <key-property name="projectCode" type="string" column="PROJECT_CODE"></key-property>
        </composite-id>
        <property name="startDate" type="date" column="START_DATE"></property>
        <property name="endDate" type="date" column="END_DATE"></property>
        <property name="role" type="string" column="PROJECT_ROLE"></property>
        <many-to-one name="employee" class="com.nousinfo.tutorial.model.Employee" ></many-to-one>
    </class>
</hibernate-mapping>
4

2 に答える 2

0

カスケードをall-delete-orphanからdeleteに変更します

必要なのは、親が削除されたときに、関連するすべての子も削除する必要があるためです。それがcascade=deleteが行うことです。

カスケード=all-delete-orphanは、子エンティティも削除するために使用されます。これは確かに異なるシナリオに役立ちます。関係が切断されると子エンティティが削除されます。たとえば、子エンティティが親エンティティのコレクションから削除された場合、休止状態のセッションが閉じられると子が削除されます。このカスケードタイプは、子エンティティが親なしでは論理的に存在できない場合に役立ちます。

于 2013-02-15T13:04:57.410 に答える
0

employee.hbm.xml で、フラグ inverse="true" を削除し、カスケードを cascade="all" に変更します。ここで inverse="true" を指定すると、このリレーションの所有者が EmployeeProject であり、必要な Employee ではないことを意味します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.nousinfo.tutorial.model.Employee" table="EMPLOYEE">
        <id type="int" name="employeeId" column="EMPLOYEE_ID"/>
        <set name="employeeProjects" cascade="all">
            <key column="EMPLOYEE_ID"/>
            <one-to-many class="com.nousinfo.tutorial.model.EmployeeProject"/>
        </set>
    </class>
</hibernate-mapping>

また、キー列の名前を EmployeeProject composite-id の名前と一致するように変更しました。そうしないと、同じ情報を持つ 2 つの列ができてしまいます。project.hbm.xml で、次のように多対 1 を変更して、正しい双方向マッピングを作成します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.nousinfo.tutorial.model.EmployeeProject" table="EMPLOYEE_PROJECT">
        <composite-id>
            <key-property type="int" name="employeeId" column="EMPLOYEE_ID"/>
            <key-property type="string" name="projectCode" column="PROJECT_CODE"/>
        </composite-id>
        <many-to-one name="employee" column="EMPLOYEE_ID" insert="false" update="false"/>
    </class>
</hibernate-mapping>
于 2013-02-15T14:14:35.457 に答える