我作为JPA提供商与Eclipselink合作。 以下代码用于从数据库访问实体:
em.merge(anEntity);
em.getTransaction().commit();
em.getTransaction().begin();
anEntity2 = em.find(targetClass, anEntity.getId());
有没有办法保证对象anEntity == anEntity2
将保持,总是返回相同的对象引用?例如,以某种方式设置Eclipselink缓存以始终返回相同的实体?
更新 我已阅读以下内容:
在JPA中,对象标识在事务中维护,并且(通常)在同一个EntityManager中。例外情况是在Java EE托管的EntityManager中,对象标识仅在事务内维护。
来源:link
我的问题是:在Java EE环境中,跨事务(通过使用链接中的变量)确实assert (employee1 == employee2);
成立了吗?
如果没有,是否有可能以某种方式绕过这个限制?
答案 0 :(得分:1)
正如链接所述,唯一的例外是Java EE管理的entityManager,因为容器必须控制EM的生命周期,并且通常在事务提交时释放它们。您拥有句柄的代理将根据需要重新获取下面的EntityManager,或者如果新事务开始。您可以直接从工厂获取EntityManager,以避免这种情况,容器也可以为您注入。这允许您直接控制其生命周期。
在您提供的代码中,尽管anEntity == anEntity2不太可能是真的,就像您需要在anEntity上调用em.merge一样,它不是托管实例。您需要在托管实例上保留一个句柄,以便在EntityManager的生命周期内保持不变。