java – Hibernate多对多映射和cascade = delete

我有一个映射(只有重要的部分):

<class name="xyz.Role" table="ROLE" lazy="true">
  <id name="id" type="java.lang.Integer">
    <column name="ROLE_ID"/>
    <generator class="increment"/>
  </id>
  <set name="assignments" lazy="true" table="PERSON_ROLE" cascade="delete" 
inverse="true">
    <key column="ROLE_ID" />
    <many-to-many class="xyz.Person" column="PERSON_ID" />
  </set> 
</class>

<class name="xyz.Person" table="PERSON" lazy="true">
  <id name="Id" type="java.lang.Integer">
    <column name="TPP_ID"/>
    <generator class="increment"/>
  </id>

  <set name="roles" lazy="true" table="PERSON_ROLE" cascade="save-update">
    <key column="PERSON_ID" />
    <many-to-many class="xyz.Role" column="ROLE_ID" />
  </set> 
</class>

使用此映射,当我删除角色时,也会删除具有此角色的人员.我想要实现的是删除Role时删除关联(PERSON_ROLE表中的行).有没有办法实现这个目标?

最佳答案
Cascade适用于实体级别.由于Person_Role未映射为实体,因此级联无法帮助您AFAIK.

您可以在从Person_Role到Role的外键上使用数据库级“on cascade delete”.

或者你可以 – 正如sfussenegger指出的那样 – 以编程方式删除关联.请注意,由于您在两个实体上映射了关联,因此Person_Role中的每一行都将在对象模型中出现两次.在这种情况下,建议从两个集合中删除相关条目,以免破坏对象模型.然而,Hibernate只会在持久化更改时查看未使用inverse =“true”映射的关联的结尾.也就是说,要从与当前映射的关联中删除,必须从Person.roles中删除,而不是从Role.assignments中删除:

for (Person p : role.assignments) {
    person.roles.remove(role)
}

或者您可能希望用关联实体替换多对多映射,在这种情况下,您可以简单地使用级联.这样您就可以更轻松地向作业添加更多信息.例如,如果您必须表达“Joe在QA上工作30%,在需求工程师中工作70%”,您可以简单地将该字段添加到关联中.

转载注明原文:java – Hibernate多对多映射和cascade = delete - 代码日志