次のエンティティに対して(EclipseLinkとtransaction-type = "RESOURCE_LOCAL"を使用して)JPA永続性を正しく設定する方法を理解するのに問題があります。
@Entity
public class User {
// snip various members
@ManyToMany
private List<Company> companies;
public void setCompanies(List<Company> companies) {
this.companies = companies;
}
}
@Entity
public class Company {
// snip various members
}
私がやろうとしているのは、会社リストのカスケードを設定して、以前に永続化されていない新しい会社がリストに含まれている場合に、ユーザーと一緒に自動的に永続化されるようにすることです。
User newUser = new User();
Company newCompany = new Company();
List<Company> companies = new ArrayList<Company>();
companies.add(newCompany);
newUser.setCompanies(companies);
entityManager.persist(newUser);
@ManyToManyにcascadeType.PERSISTを設定すると、これは問題なく機能します。しかし、会社のリストに以前に永続化された会社が含まれている場合、同じ主キーを持つ新しい会社を永続化(INSERT)しようとしているため、MySQLIntegrityConstraintViolationExceptionが発生します。
User newUser = new User();
Company oldCompany = companyDAO.find(oldCompanyId);
List<Company> companies = new ArrayList<Company>();
companies.add(oldCompany);
newUser.setCompanies(companies);
entityManager.persist(newUser);
では、新しい会社が自動的に永続化されるようにこれをどのように設定する必要がありますが、既存の会社は単にユーザーと会社のマッピングに追加されますか?