gpt4 book ai didi

java - JPA 与非 JTA : Is it possible to close EntityTransaction safely without commit?

转载 作者:行者123 更新时间:2023-12-02 08:23:39 25 4
gpt4 key购买 nike

我正在使用 JPA Toplink-essential 并开发 RESTful Web 应用程序。

首先要提到一件事。

不使用 JTA

所以我的 persistences.xml 被定义为不使用 JTA。

 <persistence-unit name="kojoPU">    
<provider>oracle.toplink.essentials.PersistenceProvider</provider>
<non-jta-data-source>machinePrototype</non-jta-data-source>

这允许实体管理器不立即使用executeUpdate()执行查询它将等待直到提交。

em.getTransaciton().begin();
Query query = em.createNativeQuery("DELETE FROM table1 WHERE theId = 10;");
query.executeUpdate(); //not yet executed until transaction is commited.

//continue do something...


em.getTransaction().commit(); //the query above is executed here finally

但是有一个大问题,在transaction.begin()之后,是否有类似JSONExceptionindexOutOfBoundsException的错误,事务没有关闭并且保持开放一段时间。

在这种情况下是否可以以某种方式强制关闭交易?

最佳答案

除非我错过了什么,否则你可能想要这样的东西:

em.getTransaciton().begin();
try {
Query query = em.createNativeQuery("DELETE FROM table1 WHERE theId = 10;");
query.executeUpdate(); //not yet executed until transaction is commited.

//continue do something...

em.getTransaction().commit(); //the query above is executed here finally
} catch (ex RuntimeException) {
em.getTransaction().rollback();
} finally {
// you probably also want something here to check the status of the transaction and rollback if you exited the try block somehow
}

但是,我相信事务管理器在提交失败时回滚是惯例,但似乎这不会发生在您身上。

此外,依赖更新查询在提交时运行也不是一个好主意,因为 Hibernate 可以决定随时运行更新(本质上是执行flush())。如果您想在最后运行查询,请在提交之前执行。

关于java - JPA 与非 JTA : Is it possible to close EntityTransaction safely without commit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4991158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com