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

时间:2011-01-19 08:43:41

标签: java hibernate jpa persistence

我意识到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实例。

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

欢呼声

2 个答案:

答案 0 :(得分:2)

  

我该怎么办?   在一个。中协调我的实体实例   会话?

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

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

答案 1 :(得分:0)

我也期望从查询中返回的C实例是之前返回的C之一(假设它具有相同的txn),因为它们已经在事务中登记,这就是DataNucleus肯定会做的事情(因为它也是实现JDO,这是规范的一部分,这就是L1缓存的用途。