JPA合并和创建的最佳实践

时间:2014-06-05 06:53:48

标签: java jpa eclipselink

我正在使用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<>();
}

1 个答案:

答案 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()实际上做了什么。