![](/img/trans.png)
[英]How to do many-to-many relationship without deleting the previous data in mapping table using Hibernate or JPA
[英]How do I delete orphan entities using hibernate and JPA on a many-to-many relationship?
我想在多對多關系中使用hibernate和JPA刪除孤立實體,但我發現的所有屬性都是屬性。 org.hibernate.annotations.CascadeType.DELETE_ORPHAN(即@Cascade(value = {org.hibernate.annotations.CascadeType.DELETE_ORPHAN)),僅適用於一對多關系。
我想知道我是否可以在多對多關系中刪除孤兒。
從“Pro JPA 2”一書中:
只有在源端具有單基數的關系才能啟用孤立刪除,這就是為@OneToOne和@OneToMany關系注釋定義orphanRemoval選項的原因,但是@ManyToOne或@ManyToMany注釋都沒有。
這是一個無賴,但ManyToMany沒有JPA自動孤兒刪除。
實際上,我使用以下實體進行了測試:
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String lastName;
@ManyToMany
@Cascade(value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Set<Role> roles = new HashSet<Role>();
//...
}
@Entity
public class Role {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToMany(mappedBy = "roles")
private Set<Person> persons = new HashSet<Person>();
//...
}
並使用以下數據集:
<dataset>
<PERSON id="1" firstname="john" lastname="doe"/>
<PERSON id="2" firstname="clark" lastname="kent"/>
<PERSON id="3" firstname="james" lastname="bond"/>
<ROLE id="1" name="foo"/>
<ROLE id="2" name="bar"/>
<ROLE id="3" name="boo"/>
<ROLE id="4" name="baz"/>
<PERSON_ROLE persons_id="1" roles_id="1"/>
<PERSON_ROLE persons_id="1" roles_id="2"/>
<PERSON_ROLE persons_id="2" roles_id="2"/>
<PERSON_ROLE persons_id="2" roles_id="3"/>
<PERSON_ROLE persons_id="3" roles_id="1"/>
<PERSON_ROLE persons_id="3" roles_id="4"/>
</dataset>
以下測試方法:
@Test
public void testCascadeDeleteOrphanOnDelete() {
Person person = entityManager.find(Person.class, 1L);
entityManager.remove(person);
ReflectionAssert.assertPropertyLenientEquals("id", Arrays.asList(2, 3), findAllPersons());
ReflectionAssert.assertPropertyLenientEquals("id", Arrays.asList(3, 4), findAllRoles());
}
private List<Person> findAllPersons() {
return entityManager.createQuery("from Person").getResultList();
}
private List<Role> findAllRoles() {
return entityManager.createQuery("from Role").getResultList();
}
剛過去。 低於產生的輸出:
Hibernate: select personx0_.id as id17_0_, personx0_.firstName as firstName17_0_, personx0_.lastName as lastName17_0_ from Person personx0_ where personx0_.id=? Hibernate: select roles0_.persons_id as persons1_1_, roles0_.roles_id as roles2_1_, rolex1_.id as id18_0_, rolex1_.name as name18_0_ from Person_Role roles0_ left outer join Role rolex1_ on roles0_.roles_id=rolex1_.id where roles0_.persons_id=? Hibernate: delete from Person_Role where persons_id=? Hibernate: delete from Role where id=? Hibernate: delete from Role where id=? Hibernate: delete from Person where id=? Hibernate: select personx0_.id as id17_, personx0_.firstName as firstName17_, personx0_.lastName as lastName17_ from Person personx0_ Hibernate: select rolex0_.id as id18_, rolex0_.name as name18_ from Role rolex0_
到目前為止,ManyToMany注釋沒有orphanRemoval屬性。 我也有同樣的問題。 並且在數據庫上實現它的建議無法解決問題。 JPA的整個哲學是反對在數據庫上實現邏輯,而是通過映射。
試試這個:
@ManyToMany(cascade = CascadeType.ALL, orphanRemoval=true, fetch = FetchType.LAZY, mappedBy = "yourObject")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.