我正在将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()的实际作用。

10-07 18:14