hibernate多对多级联不起作用

时间:2010-11-22 20:01:09

标签: java hibernate

我是一个休眠的新手,我不完全确定如何获得我正在寻找的级联行为。

我有两个类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 个答案:

答案 0 :(得分:1)

正如您所描述的,您在课堂和学生之间有一个单向多对多关系,并且有一个删除级联。这意味着删除级联只有在删除课程而不是学生时才有效。如果要删除学生,则必须先将其从相应类对象的集合中删除。否则,您将收到问题中描述的异常。

如果删除课程,该课程的所有学生也应该被删除 - 除非这些学生参加其他协会。

答案 1 :(得分:0)

我不知道,如果我完全理解你的代码(我在我的项目中使用注释)。但是你有一个单向的关联类=&gt;具有隐式连接表的学生。删除学生时,人员实体无法从关联中删除自己。

这种制作多对多的方式并非在文档中提出。推荐是明确指定加入实体,因为它更灵活。然后,您可以轻松查询或删除关联,并指定关联参数。