我正在将Java EE 7与JPA(Eclipselink)结合使用。
我有一个简单的数据库:
成员资格,人员和人员组。人员组具有成员资格。成员资格具有一个人和一个人组。
我将代码添加到人员组的代码:
Membership membership = new Membership();
membership.setPerson(person);
membership.setPersonGroup(personGroup);
personGroup.getMemberships().add(membership);
membershipSession.persist(membership);
此代码段有效。它正在与人员和人员组一起创建成员资格。
但是在此之后读取personGroup时,personGroup不包含新成员资格。
重新部署或类似方式后,人员组具有新的成员资格。持久过程成功。 JPA缓存中只有某些地方出错。
用
Membership membership = new Membership();
membership.setPerson(person);
membership.setPersonGroup(personGroup);
personGroup.getMemberships().add(membership);
membershipSession.persist(membership);
personGroupSession.merge(personGroup);
有用。我的希望是减少personGroupSession.merge(personGroup);或理解,为什么我需要这条线。
这是我的关系映射(针对这种情况简化了)
@Entity
public class PersonGroup {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "personGroup")
private List<Membership> memberships = new ArrayList<>();
}
@Entity
public class Membership {
@ManyToOne
@JoinColumn
private Person person;
@ManyToOne
@JoinColumn
private PersonGroup personGroup;
}
@Entity
public class Person {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "person")
private List<Membership> memberships = new ArrayList<>();
}
最佳答案
在下面的代码片段中
Membership membership = new Membership();
membership.setPerson(person);
membership.setPersonGroup(personGroup);
personGroup.getMemberships().add(membership);
membershipSession.persist(membership);
您所做的只是创建一个成员身份并将其持久化,您将其分配给PersonGroup,但是此Person组的更改状态不会与数据库合并。而在第二个片段的情况下
Membership membership = new Membership();
membership.setPerson(person);
membership.setPersonGroup(personGroup);
personGroup.getMemberships().add(membership);
membershipSession.persist(membership);
personGroupSession.merge(personGroup);
您正在通过调用merge()合并PersonGroup中的更改。这就是为什么第一个片段具有oldpersonGroup而第二个片段具有更新的personGroup的原因。这是文档,说明merge()的实际作用。