Ula*_*kar 3 java orm hibernate
我有一个映射(只有重要的部分):
<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表中的行).有没有办法实现这个目标?
mer*_*ike 10
Cascade适用于实体级别.由于Person_Role未映射为实体,级联无法帮助您AFAIK.
您可以使用数据库级的"关于级联删除"从外键Person_Role来Role.
或者你可以 - 正如sfussenegger指出的那样 - 以编程方式删除关联.请注意,由于您在两个实体上映射了关联,因此每个行Person_Role都会在对象模型中出现两次.在这种情况下,建议从两个集合中删除相关条目,以免破坏对象模型.但是,Hibernate只会查看inverse="true"持久更改时未映射的关联的结尾.也就是说,要从与当前映射的关联中删除,您必须从中删除Person.roles,而不是Role.assignments:
for (Person p : role.assignments) {
person.roles.remove(role)
}
Run Code Online (Sandbox Code Playgroud)
或者您可能希望用关联实体替换多对多映射,在这种情况下,您可以简单地使用级联.这样您就可以更轻松地向作业添加更多信息.例如,如果您必须表达"Joe在QA上工作30%,在需求工程师中工作70%",您可以简单地将该字段添加到关联中.
| 归档时间: |
|
| 查看次数: |
9040 次 |
| 最近记录: |