Java JPA / Hibernate:如何在会话中避免实体的多个实例?

我意识到JPA不能像我预期的那样工作,因为我经常最终在会话中使用单个实体的多个实例.

以下是研究案例:父母有一个与@OneToMany映射的子集合

在一个方法中:

>获取父P的实例
实体
>使用P.getChilds()加载子集合:它包含C1和C2的实例
>然后找到具有优化JPA查询的特定Child,其中Parent P具有参数:Child C = dao.getSpecificChild(P)

在这里,我希望C是已经加载的两个实例之一(C1或C2).我以为JPA会在当前会话中检查已经存在的实例.
但是JPA会加载一个新的C实例(无论是C1还是C2都没关系).

所以我最终得到了两个不同的C实例.

我的问题是:这是预期的行为吗?
如果是,我如何在会话中协调我的实体实例?

干杯

最佳答案

how can I
reconcile my entity instances in a
session?

如果要将状态从实体a转移到实体b,可以执行以下操作:

entityManager.merge(a);
entityManager.refresh(b);
点赞