我遇到了一些困难,不知道如何正确地设置JPA持久性(使用EclipseLink和transaction-type=“RESOURCE_LOCAL”)以适配以下实体:
我试图为公司列表设置级联,以便如果列表中有一个尚未先前持久化的新公司,则它将自动与用户一起被持久化。
通过在@ManyToMany上设置cascadeType.PERSIST,这个问题就可以很好地解决。但是,如果公司列表中包含先前持久化的公司,我会收到一个MySQLIntegrityConstraintViolationException,因为它试图持久化(INSERT)具有相同主键的新公司:
那么应该如何设置,以便新公司自动持久化,而现有公司仅添加到用户-公司映射中?
@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,这个问题就可以很好地解决。但是,如果公司列表中包含先前持久化的公司,我会收到一个MySQLIntegrityConstraintViolationException,因为它试图持久化(INSERT)具有相同主键的新公司:
User newUser = new User();
Company oldCompany = companyDAO.find(oldCompanyId);
List<Company> companies = new ArrayList<Company>();
companies.add(oldCompany);
newUser.setCompanies(companies);
entityManager.persist(newUser);
那么应该如何设置,以便新公司自动持久化,而现有公司仅添加到用户-公司映射中?