我正在使用Java EE 7和JPA(Eclipselink)。
我有一个简单的数据库:
会员,人和人。 Persongroup有会员资格。会员资格有一个人和一个人。
我将代码添加到persongroup的代码:
Membership membership = new Membership();
membership.setPerson(person);
membership.setPersonGroup(personGroup);
personGroup.getMemberships().add(membership);
membershipSession.persist(membership);
此代码段有效。它正在与人和persongroup创建成员资格。 但是在读完personGroup之后,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<>();
}
答案 0 :(得分:0)
以下代码snipet
Membership membership = new Membership();
membership.setPerson(person);
membership.setPersonGroup(personGroup);
personGroup.getMemberships().add(membership);
membershipSession.persist(membership);
您正在做的只是创建一个成员资格并保留它,您将其分配给PersonGroup,但随后更改的人员组状态未与数据库合并。而在第二个snipet的情况下
Membership membership = new Membership();
membership.setPerson(person);
membership.setPersonGroup(personGroup);
personGroup.getMemberships().add(membership);
membershipSession.persist(membership);
personGroupSession.merge(personGroup);
您正在通过调用merge()合并PersonGroup中的更改。这就是为什么你的第一个snipet有旧的personGroup而你的第二个snipet有更新的personGroup的原因。以下是文档说明merge()实际上做了什么。