似乎在将 Play Framework 2.2.2 与 eBean ORM 一起使用时 @play.db.ebean.Transactional
抛出异常时不回滚事务。
你们有人知道这个问题以及如何解决它吗?
我看到 eBean 在他们的 avaje-ebeanorm-agent 3.2.2 中有一个关于这个问题的 BUG。 :https://github.com/ebean-orm/avaje-ebeanorm/pull/44 https://github.com/ebean-orm/avaje-ebeanorm/pull/44在 avaje-ebeanorm 3.2.3 版本中修复
还玩2.2.2似乎使用avaje-ebeanorm-agent 3.2.2,当我将其更改为更高版本时
built.scala (3.2.5) 使用 JPA 注释时出现了一些崩溃(例如 orphanRemoval 无法识别)
附: Play 2.1.1 也有类似的讨论,play 2.1.1:无法使用ebean orm回滚事务 https://stackoverflow.com/questions/17076055/play-2-1-1-unable-to-rollback-transaction-with-ebean-orm,但没有找到在 Action 中使用 @Transactional 的问题的明确解决方案。
我遇到了类似的问题,但我只用 play 版本 2.3.7 进行了测试:
我注意到有两个不同的库包含事务注释:@com.avaje.ebean.annotation.Transactional
and @play.db.ebean.Transactional
.
显然,它们中的每一个都只适用于某种类型的类,并且当使用错误时,不会执行回滚。这是我通过测试发现的:
-
@com.avaje.ebean.annotation.Transactional
:
仅适用于代表模型的类中的方法,即它们具有@javax.persistence.Entity
注解。然而,ebean 增强中似乎存在一个错误,这会导致类尽管没有进行任何更改,但总是重新编译 https://stackoverflow.com/questions/27986780/play-2-3-7-sbt-multiproject-compiler-issue/28148371#28148371
-
ebean 的文档 http://www.avaje.org/ebean/introtrans_begin.html给出了另外两种实现交易的方式,例如您可以使用 try/finally 块。在我的测试中,这种方式一直运行良好,并且执行了回滚。
-
@play.db.ebean.Transactional
:仅适用于操作,即该类派生自play.mvc.Controller
。我不确定这种行为是否是有意为之,但游戏框架的文档 https://www.playframework.com/documentation/2.3.x/JavaEbean只谈交易actions并且根本没有提到模型类。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)