Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠多对多映射并级联=删除_Java_Hibernate_Orm - Fatal编程技术网

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)
}