Java 休眠多对多映射并级联=删除
我有一个映射(仅重要部分): 及Java 休眠多对多映射并级联=删除,java,hibernate,orm,Java,Hibernate,Orm,我有一个映射(仅重要部分): 及 使用此映射,当我删除角色时,具有此角色的每个人也会被删除。我想要实现的是在删除角色时删除关联(PERSON_ROLE表中的行)。有什么方法可以做到这一点吗?为什么不在删除角色之前调用role.getAssignments().clear() for (Person p : role.getAssignments()) { person.getRoles.remove(role) } role.getAssignments.clear(); session
使用此映射,当我删除角色时,具有此角色的每个人也会被删除。我想要实现的是在删除角色时删除关联(PERSON_ROLE表中的行)。有什么方法可以做到这一点吗?为什么不在删除角色之前调用
role.getAssignments().clear()
for (Person p : role.getAssignments()) {
person.getRoles.remove(role)
}
role.getAssignments.clear();
session.delete(role);
我不太喜欢
cascade=“delete”
。每当我想到一段XML能够删除整个有价值的数据表时,我都会有一种奇怪的直觉:)根本不要在角色方面设置映射。如果您最终需要此信息,请通过HQL查询获取。也就是说,摆脱这个:
<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>
级联在实体级别工作。由于Person\u Role
未映射为实体,因此cascade无法帮助您解决问题
您可以在从Person\u Role
到Role
的外键上使用数据库级别的“on cascade delete”
或者,正如Sfussenger指出的那样,您可以通过编程方式删除关联。请注意,由于在两个实体上都映射了关联,因此Person\u Role
中的每一行将在对象模型中出现两次。在这种情况下,建议从两个集合中删除相关条目,以免损坏对象模型。但是,当保持更改时,Hibernate将只查看未映射为reverse=“true”
的关联的结尾。也就是说,要从与当前映射的关联中删除,必须从Person.roles
中删除,而不是从Role.assignments
中删除:
for (Person p : role.assignments) {
person.roles.remove(role)
}
或者您可能希望用关联实体替换多对多映射,在这种情况下,您可以简单地使用级联。这将使您能够更轻松地为作业添加更多信息。例如,如果您必须表示“Joe 30%从事QA工作,70%从事需求工程师工作”,您可以简单地将该字段添加到关联中。这不起作用。当我使用cascade=“delete”时,它会删除每个人。如果我删除cascade=“delete”则在删除角色时会出现错误,因为外键约束失败。删除前应通过调用.clear()解决外键约束错误。我不确定。例如,Hibernate可能会将它们设置为null,但我确信它不会:)+1,因为@Ula似乎有点吝啬。这是一个非常好的答案!:)
<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>
SELECT p FROM Person p JOIN p.roles WHERE role=:role
for (Person p : role.assignments) {
person.roles.remove(role)
}