2011-01-19 67 views
3

我意识到JPA不能像我期望的那样工作,因为我经常会在会话中结束多个单个实体的实例。Java JPA/Hibernate:如何避免会话中实体的多个实例?

这里的学习情况:父与@OneToMany

映射在一个单一的方法孩子的集合:

  • 获取父P 实体
  • 负荷集合的一个实例(包含C1和C2的实例):它包含C1和C2的一个实例
  • 然后找到具有父P具有参数的优化JPA查询的特定子查询:Child C = dao.getSpecificChild(P)

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

让我最终下的两个不同的实例

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

欢呼

+0

父P&dao.getSpecificChild(P)的实例通过使用相同或不同的实体管理器来获取 – 2011-01-19 11:04:42

回答

2

我怎么能 调和我的实体实例在 会议?

如果你想从实体转移状态,实体B,你可以做到以下几点:

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

似乎是一个很好的选项,可以将看起来像缺陷行为的东西修补给我!干杯 – nodje 2011-01-21 02:40:00

0

我也希望从该查询返回C的实例是先前一个返回的Cs(假设它与txn相同),因为它们已经被加入到事务中了,这就是DataNucleus当然会做的事情(因为它也实现了JDO,这是规范的一部分),这就是L1缓存的作用。