Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 选择给定数据时防止刷新EntityManager_Hibernate_Jpa_Transactions_Entitymanager_Flush - Fatal编程技术网

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

Hibernate 选择给定数据时防止刷新EntityManager,hibernate,jpa,transactions,entitymanager,flush,Hibernate,Jpa,Transactions,Entitymanager,Flush,我正在开发一个JPA应用程序(使用hibernate),我正在使用自动刷新功能 默认情况下,每当我们处理对任何实体的查询时,都会刷新完整的EntityManager。在大多数情况下这是可以的:我们希望JPA处理针对最新数据库的查询 然而,我们也在数据库中存储了一些功能参数。 这与我们的核心业务模型完全分离,我们不希望选择我们刷新EM的参数:获取参数可能会在流程中发生相当深的过程,我们知道后会失去刷新EM的控制;还可以 事实上,这会导致一些DB约束异常:数据模型还不一致(在流程中间),选择参数会强

我正在开发一个JPA应用程序(使用hibernate),我正在使用自动刷新功能

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

然而,我们也在数据库中存储了一些功能参数。 这与我们的核心业务模型完全分离,我们不希望选择我们刷新EM的参数:获取参数可能会在流程中发生相当深的过程,我们知道后会失去刷新EM的控制;还可以

事实上,这会导致一些DB约束异常:数据模型还不一致(在流程中间),选择参数会强制刷新此数据模型

我正在考虑添加第二个entityManager,只是其中的一个参数,但我发现它有点过头了

这个问题能更容易解决吗?使用参数DAO上的隔离级别
,以便在单独的事务中处理参数?

I。如果使用JTA:

  • 尝试在
    参数dao
    中使用新事务。这样,外部服务中的托管实体将不会在内置DAO(IMHO!)中进行管理。缺点是,当
    参数dao
    返回时,事务将提交(如果不需要提交,您可以使用状态完整的EJB,但对我来说,这似乎是一个过分的操作)
  • 否则,在我看来,拥有第二个EntityManager并不是一件过分的事情

  • 二,。如果使用RESOURCE-LOCAL:


    如果您在应用程序管理的环境中(
    transaction type=“RESOURCE_LOCAL”
    ),只需从
    EntityManager工厂
    获取另一个
    EntityManager
    (与拥有第二个
    EntityManager
    类似)

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

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

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


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

    我真的很好奇您如何“从XA连接池中打开新连接”,请您提供更多详细信息?。PS:这可能是一个有趣的解决方案,但到目前为止还没有使用标准API。请查看我的。它在同一个数据库的同一事务中登记了两个数据源:testDataSource和otherDataSource,每个数据源都有自己的连接。DEBUG[main]:b.t.t.Preparer-使用uniqueName=otherDataSource DEBUG[main]准备资源和XAResourceHolderState:b.t.t.Preparer-准备资源一个XAResourceHolderState,其uniqueName=testDataSource这不是您在回答中所描述的:在github上,您有两个不同的
    数据源,您在回答中谈到为同一
    数据源检索两个连接。我更新了我的回答。TM会将当前线程绑定到相同的连接上,即使我们在每条语句后主动释放它。因此,一个DS就是一个XS资源,但是对于一个线程,您总是在一个Tx中获得相同的连接。但是,即使对于同一个DB/Schema,您也可以生成多个DS,然后您就可以完成这个任务了。使用多个
    数据源
    s的解决方案比使用两个
    EntityManager
    更糟糕。一个理由是:您的工作级别低于JPA,另一个理由是:您必须处理对Bitronix JTA manager的非EE标准调用。