我有Entity
一个双向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 不尝试持久化作为关系的一部分并且已经持久化的实体?