Eclipselink缓存 - 在事务中保留相同的对象

时间:2015-03-05 17:15:38

标签: java jpa eclipselink

我作为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);成立了吗? 如果没有,是否有可能以某种方式绕过这个限制?

1 个答案:

答案 0 :(得分:1)

正如链接所述,唯一的例外是Java EE管理的entityManager,因为容器必须控制EM的生命周期,并且通常在事务提交时释放它们。您拥有句柄的代理将根据需要重新获取下面的EntityManager,或者如果新事务开始。您可以直接从工厂获取EntityManager,以避免这种情况,容器也可以为您注入。这允许您直接控制其生命周期。

在您提供的代码中,尽管anEntity == anEntity2不太可能是真的,就像您需要在anEntity上调用em.merge一样,它不是托管实例。您需要在托管实例上保留一个句柄,以便在EntityManager的生命周期内保持不变。