选择给定数据时,防止刷新EntityManager

时间:2014-05-23 12:50:47

标签: hibernate jpa transactions entitymanager flush

我正在开发一个JPA应用程序(使用hibernate),我正在使用 AutoFlush 功能。

默认情况下,每当我们处理任何实体的查询时,都会刷新完整的 EntityManager 。在大多数情况下这是可以的:我们希望JPA处理针对最新数据库的查询。

然而,我们还在数据库中存储了一些功能参数。 这与我们的核心业务模型完全分开,我们不希望选择参数我们刷新EM:参数的获取可能在过程中发生得非常深,当我们知道它时,我们失去了冲洗EM的控制;确定。

实际上,这会导致一些DB约束异常:数据模型尚未一致(在进程的中间),并且选择参数会强制刷新此数据模型。

我正在考虑添加第二个 entityManager ,只是参数,但我发现它有点矫枉过正。

能否更容易解决?在参数DA​​O上使用隔离级别,以便在单独的事务中处理参数?

2 个答案:

答案 0 :(得分:3)

这可以通过JTA事务解决,但您需要一个JTA事务管理器。如果您在Java EE应用程序服务器中运行,那么您已经拥有JTA支持。如果您运行基于Spring的应用程序,则需要包含独立的TM,例如Bitronix

然后,JTA允许您在单个全局事务中为同一个数据库(但来自同一个线程的多个数据源)登记多个连接。因此,您的实体管理器将登记一个连接,然后您可以从XA连接池(由您的JTA事务管理器提供,如Bitronix)打开一个新连接,并保存功能参数

这两个登记的连接将被隔离,因此在提交事务之前,第二个连接中的更改将不可用。

如果不需要通过JPA保存功能参数,则使用Spring JDBC更容易完成此任务。否则,您需要两个实体管理器,这将使您的设置更加复杂。

答案 1 :(得分:1)

予。如果你使用JTA:

  1. 尝试在ParametersDAO中使用新的交易。这样,外部服务中的托管实体将不会在内置DAO(恕我直言!)中进行管理。缺点是,当你的ParametersDAO返回时,事务将提交(如果不需要,你可以使用Statefull EJB,但这对我来说似乎有点过分了。)
  2. 否则,拥有第二个EntityManager对我来说似乎不太可能。

  3. II。如果您使用RESOURCE-LOCAL:

    如果您处于应用程序管理环境(transaction-type="RESOURCE_LOCAL"),只需从EntityManager获取另一个EntityManagerFactory(类似于第二个EntityManager)。