实体未按预期提交(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)的主要内容,如果未能解决你的问题,请参考以下文章
hibernate 中的ORM是如何与数据库实现存储和查询的