Гибридный каскад «многие ко многим» не работает - PullRequest
1 голос
/ 22 ноября 2010

Я новичок в спящем режиме, и я не совсем уверен, как получить каскадное поведение, которое я ищу.

У меня есть два класса Student и Class с однонаправленным отображением "многие ко многим".Когда я удаляю студента, у меня возникает это исключение

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>

Большое спасибо

Ответы [ 2 ]

1 голос
/ 22 ноября 2010

Как вы описали, у вас есть однонаправленное отношение «многие ко многим» между классом и учеником с каскадом при удалении. Это означает, что каскад при удалении работает, только если вы удаляете класс, а не студента. Если вы хотите удалить ученика, вы должны сначала удалить его из коллекции в соответствующем объекте класса. В противном случае вы получите исключение, описанное в вашем вопросе.

Если вы удалите класс, все ученики в этом классе также должны быть удалены - если только эти студенты не участвуют в других ассоциациях.

0 голосов
/ 22 ноября 2010

Не знаю, полностью ли я понимаю ваш код (я использую аннотации в своем проекте).Но у вас есть класс однонаправленной ассоциации => student с таблицей неявного соединения.Когда вы удаляете ученика, сущность человека не может удалить себя из ассоциации.

Этот способ создания многих для многих не рекомендуется в документации.Рекомендуется явно указывать присоединяющуюся сущность, поскольку она более гибкая.Затем вы можете легко запросить или удалить ассоциацию, и вы можете назначить параметры ассоциации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...