实体未按预期提交(Hibernate ORM with Panache)

Posted

技术标签:

【中文标题】实体未按预期提交(Hibernate ORM with Panache)【英文标题】:Entity not committed when expected (Hibernate ORM with Panache) 【发布时间】:2020-02-12 17:34:13 【问题描述】:

在进程执行期间,我打开了两个事务:

用于创建对象并通知进程已启动; 另一个改变在第一个事务中创建的对象,通知该过程已完成;

但是,在执行第二个事务方法后,如果我查询数据库,则该值尚未更新。我的预期是,在带有@transactional注解的方法执行完成后,对象已经提交到数据库了。

情况的再现是在项目中: https://github.com/emersonl91/quarkus-test

重要线路: https://github.com/emersonl91/quarkus-tests/blob/master/code-with-quarkus/src/main/java/org/acme/MyService.java#L32

https://github.com/emersonl91/quarkus-tests/blob/master/code-with-quarkus/src/test/java/org/acme/ExampleResourceTest.java#L37


编辑 1:我测试了 UserTransaction 和 TransactionManager 类,但同样的问题也出现了。


编辑 2: 在 transactionTest 方法中我添加了 @transactional(NOT_SUPPORTED) 注释,在持久和更新方法中我添加了 @transactional(REQUIRES_NEW) 注释。结果没有改变。

【问题讨论】:

【参考方案1】:

如果将@Transactional 移动到transactionTest() 方法会发生什么?

【讨论】:

进程运行成功,但是在单个事务中,而不是像我预期的那样在 3 中。【参考方案2】:

默认事务传播级别是必需的。因此,如果一个方法(用@Transactional 注释)调用另一个方法(用@Transactional 注释),则第二种方法将使用第一种方法的现有事务,而不是创建新的。为了对第二种方法强制执行新事务,您需要将第二种方法的传播级别更改为 REQUIRES_NEW。也就是说,我从来没有找到一个用例。

见https://www.baeldung.com/spring-transactional-propagation-isolation

【讨论】:

我做了这个测试: 1. 在transactionTest方法中我添加了@Transactional(NOT_SUPPORTED)注解; 2.在persist和update方法中我添加了@Transactional(REQUIRES_NEW)注解;结果没有改变..

以上是关于实体未按预期提交(Hibernate ORM with Panache)的主要内容,如果未能解决你的问题,请参考以下文章

MVC3 数据库实体未按预期初始化

All 子句核心数据谓词未按预期工作

hibernate 中的ORM是如何与数据库实现存储和查询的

e.PreventDefault()未按预期触发,表单提交[重复]

使用 jQuery 将值发布到 api 未按预期工作

javax.persistence NamedQuery 未按预期工作