在 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
我正在尝试将我的 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