播放2.2.2 @Transactional的eBean不会在Exception抛出中回滚事务

时间:2014-04-01 19:50:01

标签: scala playframework playframework-2.0 ebean

似乎在将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,版本为avaje-ebeanorm 3.2.3 同样玩2.2.2似乎使用avaje-ebeanorm-agent 3.2.2并且当我将其更改为更高版本时 Built.scala(3.2.5)出现了一些使用了JPA注释的崩溃(像orphanRemoval一样无法识别)

P.S。与Play 2.1.1 play 2.1.1: Unable to rollback transaction with ebean orm有类似的讨论,但没有明确解决在操作中使用@Transactional的问题。

1 个答案:

答案 0 :(得分:5)

我遇到了类似的问题,但是我只测试了游戏版本2.3.7。:

我注意到有两个不同的库包含Transactional-annotation:@com.avaje.ebean.annotation.Transactional@play.db.ebean.Transactional

显然,每个类只能在某种类型的类中工作,如果使用错误,则不会执行回滚。这是我通过测试发现的:

  • @com.avaje.ebean.annotation.Transactional: 仅适用于表示模型的类中的方法,即它们具有@javax.persistence.Entity注释。但是,在ebean增强中似乎存在一个错误,导致类always recompile although no changes were made
  • ebean's documentation提供了另外两种实现交易的方式,例如你可以使用try / finally块。在我的测试中,这种方式一直运行良好,并且执行了回滚。
  • @play.db.ebean.Transactional:仅适用于操作,即该类派生自play.mvc.Controller。我不确定这种行为是否有意,但documentation of play-framework只讨论交易操作,并且根本没有提及模型类。