在 Play 中放置@Transactional 注释的位置

Where to place @Transactional annotation in Play

我正在尝试将我的 Play 应用程序与数据库连接,我遵循控制器->服务->DAO 层样式。

@Transactional 注解应该放在哪里。在控制器操作方法中,或者我可以将它放在服务层 class level/method 级别。

我尝试在服务层 class 的方法之一中保留 @Transactional 注释,但它引发了运行时错误。

[RuntimeException: No EntityManager found in the context. Try to annotate your action method with @play.db.jpa.Transactional]

那么,我们是否必须仅在控制器操作之上使用@Transactional?我正在使用 play 2.4.2 版本。如果是,为什么?当我在服务层调用我的 DAO 时,我猜实际的数据库操作将在服务层开始,而不是在控制器中。在控制器中,我只是调用服务层。

我建议不要使用 @Transactional,因为它将整个操作包装在 JPA 事务中。在靠近数据库调用的地方开始事务会更有效率。

我更喜欢在服务级别开始交易。同样重要的是要注意数据库调用是一个阻塞过程,因此它必须在默认操作上下文之外执行。

看看简单的 DAO+Service 示例 https://gist.github.com/dzagorovsky/b8064c97ba647ed453ab

另请阅读此处的线程池 https://www.playframework.com/documentation/2.4.x/ThreadPools#Using-other-thread-pools

此处描述的阻塞代码(数据库调用)处理:https://www.playframework.com/documentation/2.3.x/JavaAsync