我有一個Entity
與標記爲CascadeType.ALL
的雙向ManyToMany
關係(在同一實體上)。如何在標有CascadeType.ALL的關係中添加持久實體?
這裏是如何將查找Contact
實體:
@ManyToMany(cascade= CascadeType.ALL)
private List<Contact> parentContacts = new ArrayList<Contact>();
@ManyToMany(cascade= CascadeType.ALL, mappedBy="parentContacts")
private List<Contact> childContacts = new ArrayList<Contact>();
我有應該在服務器端的方法做保存這個實體:
public AltContact saveContact(EntityManager em, Contact contact, List<Contact> childs) {
for (Contact c : childs) {
contact.getChildContacts().add(c);
c.getParentContacts().add(contact);
}
if (contact.getId() == null) {
em.persist(contact);
} else {
contact = em.merge(contact);
}
return contact;
}
它的偉大工程,如果contact
或childs
列表中的任何實體都不會被保留。但有時我會需要使用saveContact
法已經堅持實體,當我嘗試這樣做,好像JPA嘗試堅持的關係的所有實體,然後將引發異常:
Internal Exception: java.sql.SQLIntegrityConstraintViolationException
事實上,它會試圖改變並已經堅持實體,所以Contact
的ID字段的唯一性將被違反。
如何激活?我的方法有什麼問題?
我該如何讓Eclipselink/JPA不嘗試堅持屬於關係且已經存在的實體的實體?