【问题标题】:Play 2.5 - @Transactional readOnly ignored?Play 2.5 - @Transactional readOnly 被忽略?
【发布时间】:2019-12-03 22:26:11
【问题描述】:

我有一个 Java Play 2.5 应用程序,并且我有一个标记为只读的事务(在控制器级别):

    @Transactional(readOnly = true)
    public Result list() { ...

(这是 play.db.jpa.Transactional 注释)。

所以,如果我打开休眠事务的日志记录:

 <logger name="org.hibernate.engine.transaction" level="TRACE"/>

然后我看到正在执行和提交的事务。

019-12-03 23:42:23,754 [debug] from org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator in main - No JtaPlatform was specified, checking resolver
2019-12-03 23:42:23,755 [debug] from org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformResolverInitiator in main - No JtaPlatformResolver was specified, using default [org.hibernate.engine.transaction.jta.platform.internal.StandardJtaPlatformResolver]
2019-12-03 23:42:23,766 [debug] from org.hibernate.engine.transaction.jta.platform.internal.StandardJtaPlatformResolver in main - Could not resolve JtaPlatform, using default [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2019-12-03 23:58:46,769 [debug] from org.hibernate.engine.transaction.internal.TransactionImpl in application-akka.actor.default-dispatcher-5 - begin
2019-12-03 23:58:46,878 [error] from application in application-akka.actor.default-dispatcher-5 - Transaction: org.hibernate.engine.transaction.internal.TransactionImpl@3d505ddd[transactionCoordinator=org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl@89a1241,exceptionConverter=org.hibernate.internal.ExceptionConverterImpl@76f0443c,transactionDriverControl=org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl@49f1518a]
2019-12-03 23:59:27,638 [debug] from org.hibernate.engine.transaction.internal.TransactionImpl in application-akka.actor.default-dispatcher-5 - committing

但是,我有一个问题 - 它不是只读的!我添加了一些修改对象的代码(obj.setField("changed value")),并在事务结束时将其保存到数据库中!

我期待一个异常告诉我事务是只读的并且不能提交!

  1. 为什么事务不是只读的?
  2. 如果 Hibernate 以只读方式创建事务,我能否以某种方式在日志中查看?

其他信息:Java Play 2.5.10、Hibernate 5 (5.2.6) 和 PostgreSQL 作为数据库。

【问题讨论】:

    标签: java hibernate playframework


    【解决方案1】:

    所以,似乎是因为控制器类本身是用@Transactional注解的,而方法是用@Transactional(readOnly=true)注解的。

    不知何故,类注解覆盖了方法注解。这对我来说似乎不合逻辑,但在实践中,情况似乎就是这样:一旦我从类级别中删除了@Transactional,它就可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 2013-11-05
      • 2017-08-19
      • 2015-09-09
      • 2023-03-24
      • 2019-02-18
      • 1970-01-01
      相关资源
      最近更新 更多