Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA合并和创建的最佳实践_Java_Jpa_Eclipselink - Fatal编程技术网

Java JPA合并和创建的最佳实践

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

我将JavaEE7与JPA(Eclipselink)一起使用

我有一个简单的数据库:

会员、个人和个人团体。个人团体有会员资格。会员包括一个人和一个人组

向persongroup添加成员资格的我的代码:

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);