2010-11-22 7 views
1

私は休止状態の初心者です。私が探しているカスケード動作を取得する方法が完全にはわかりません。休止状態の多対多カスケードは動作しません

私は単方向の多対多マッピングを持つ2つのクラスの学生とクラスを持っています。私は学生を削除すると、私は理由を理解していない

Cannot delete or update a parent row: a foreign key constraint fails (projet.T_CLASS_STUDENT, CONSTRAINT FK5DBF3D8967BCDD8B FOREIGN KEY (PERSON_ID) REFERENCES T_STUDENT (PERSON_ID))

この例外をしました、私は「削除」するのではなく、それは動作しませんだカスケードを設定しました! 実際、学生を削除すると、アソシエーションテーブルにあるすべての生徒を削除します。

私のマッピングファイルは、次のとおりです。

<class name="persistenceClass.Class" table="T_CLASS"> 

    <id name="Id" column="CLASS_ID"> 
     <generator class="native" /> 
    </id> 
    <many-to-one name="Formation" column="CLASS_FORMATION" class="persistenceClass.Formation" /> 
    <many-to-one name="Year" column="CLASS_YEAR" class="persistenceClass.Year" /> 
    <set name="Students" table="T_CLASS_STUDENT" cascade="delete" > 
     <key column="CLASS_ID" /> 
     <many-to-many class="persistenceClass.Student" column="PERSON_ID" />   
    </set> 
</class> 

と:

<class name="persistenceClass.Person" table="T_PERSON" > 

    <id name="Id" column="PERSON_ID" > 
     <generator class="native" /> 
    </id> 
    <property name="FirstName" column="PERSON_FIRST_NAME" not-null="true" /> 
    <property name="LastName" column="PERSON_LAST_NAME" not-null="true" /> 
    <property name="Type" column="PERSON_TYPE" not-null="true" /> 
    <property name="BirthDate" column="PERSON_BIRTH_DATE" /> 
    <property name="BirthCity" column="PERSON_BIRTH_CITY" /> 
    <property name="PhoneNumber" column="PERSON_PHONE_NUMBER" /> 
    <property name="MobileNumber" column="PERSON_MOBILE_NUMBER" /> 
    <property name="Mail" column="PERSON_MAIL" /> 
    <property name="Address" column="PERSON_ADDRESS_ADDRESS" /> 
    <property name="ZipCode" column="PERSON_ADDRESS_ZIPCODE" /> 
    <property name="City" column="PERSON_ADDRESS_CITY" /> 
    <property name="Image" column="PERSON_IMAGE" type="image" /> 
    <many-to-one name="Country" column="PERSON_ADDRESS_COUNTRY" class="persistenceClass.Country" /> 
    <many-to-one name="BirthCountry" column="PERSON_BIRTH_COUNTRY" class="persistenceClass.Country" /> 
    <many-to-one name="Civility" column="PERSON_CIVILITY" class="persistenceClass.Civility" /> 
    <many-to-one name="Sex" column="PERSON_SEX" class="persistenceClass.Sex" /> 
    <joined-subclass name="persistenceClass.Student" table="T_STUDENT"> 
     <key column="PERSON_ID" /> 
    </joined-subclass> 
    <joined-subclass name="persistenceClass.Teacher" table="T_TEACHER"> 
     <key column="PERSON_ID" /> 
    </joined-subclass> 
</class> 

どうもありがとう

答えて

1

あなたが説明したように、あなたは、クラス間の単方向多対多の関係を持っています削除のカスケードを持つ学生。つまり、削除したカスケードは、クラスではなく学生を削除する場合にのみ機能します。生徒を削除するには、まず対応するクラスオブジェクトのコレクションから削除する必要があります。それ以外の場合は、あなたの質問に記載されている例外が発生します。

クラスを削除する場合、そのクラスのすべての生徒も削除する必要があります。ただし、これらの生徒は他の団体に参加しない限り削除する必要があります。

0

私はあなたのコードを完全に理解していれば分かりません(プロジェクトで注釈を使用しています)。しかし、暗黙のjoinテーブルを持つunidirected association class => studentがあります。 studentを削除すると、personエンティティが自身を関連から削除する方法はありません。

このように多くのものを作成するこの方法は、ドキュメントでは推奨されません。 Recomendedは結合エンティティを明示的に指定することです。その後、簡単に関連付けを照会または削除することができ、関連パラメータを割り当てることができます。

関連する問題