とマークされた(同じエンティティ上の)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
確かに、それは永続化してすでに永続化されているエンティティを試行するため、のIDフィールドの単一性Contact
に違反します。
これをどのようにアクティブにできますか?私のアプローチの何が問題になっていますか?
Eclipselink / JPAが、関係の一部であり、すでに永続化されているエンティティを永続化しようとしないようにするにはどうすればよいですか?