Java JPA合并和创建的最佳实践
我将JavaEE7与JPA(Eclipselink)一起使用 我有一个简单的数据库: 会员、个人和个人团体。个人团体有会员资格。会员包括一个人和一个人组 向persongroup添加成员资格的我的代码:Java JPA合并和创建的最佳实践,java,jpa,eclipselink,Java,Jpa,Eclipselink,我将JavaEE7与JPA(Eclipselink)一起使用 我有一个简单的数据库: 会员、个人和个人团体。个人团体有会员资格。会员包括一个人和一个人组 向persongroup添加成员资格的我的代码: Membership membership = new Membership(); membership.setPerson(person); membership.setPersonGroup(personGroup); personGroup.getMemberships().add(mem
Membership membership = new Membership();
membership.setPerson(person);
membership.setPersonGroup(personGroup);
personGroup.getMemberships().add(membership);
membershipSession.persist(membership);
这段代码有效。它正在创建person和persongroup的成员资格。
但是在阅读personGroup之后,personGroup不包含新成员。
重新部署或类似操作后,persongroup拥有新成员资格。持久化过程是成功的。只有JPA缓存中的某些内容出错
与
它起作用了。我的希望是减少personGroupSession.merge(personGroupSession);或者理解,为什么我需要这条线
这是我的关系映射(针对本例减少)
@实体
公共类个人组{
@OneToMany(cascade=CascadeType.ALL,mappedBy=“personGroup”)
私有列表成员身份=新的ArrayList();
}
@实体
公共班级成员资格{
@许多酮
@连接柱
私人;
@许多酮
@连接柱
私人私人私人团体;
}
@实体
公共阶层人士{
@OneToMany(cascade=CascadeType.ALL,mappedBy=“person”)
私有列表成员身份=新的ArrayList();
}
在下面的代码中
Membership membership = new Membership();
membership.setPerson(person);
membership.setPersonGroup(personGroup);
personGroup.getMemberships().add(membership);
membershipSession.persist(membership);
您所做的只是创建一个成员身份并将其持久化—您正在将其分配给PersonGroup,但随后person group的更改状态不会与数据库合并。如果是第二只鹬
Membership membership = new Membership();
membership.setPerson(person);
membership.setPersonGroup(personGroup);
personGroup.getMemberships().add(membership);
membershipSession.persist(membership);
personGroupSession.merge(personGroup);
您正在通过调用merge()来合并PersonGroup中的更改。这就是为什么你的第一只鹬拥有旧的personGroup,而你的第二只鹬拥有更新的personGroup的原因。下面是文档说明的实际情况。我猜多个缓存实例存在请共享您的关系映射-这可能是关键。
Membership membership = new Membership();
membership.setPerson(person);
membership.setPersonGroup(personGroup);
personGroup.getMemberships().add(membership);
membershipSession.persist(membership);
Membership membership = new Membership();
membership.setPerson(person);
membership.setPersonGroup(personGroup);
personGroup.getMemberships().add(membership);
membershipSession.persist(membership);
personGroupSession.merge(personGroup);