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

srk*_*srk 3 playframework playframework-2.0

我正在尝试将我的Pl​​ay应用程序与数据库连接,我正在遵循controller-> service-> DAO图层样式.

应该在哪里放置@Transactional注释.在控制器操作方法中,还是可以将其放在服务层类级别/方法级别中.

我尝试在一个Service层类的方法中保留@Transactional注释,并且它抛出了运行时错误.

[RuntimeException:在上下文中找不到EntityManager.尝试使用@ play.db.jpa.Transactional]注释您的操作方法

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

dza*_*sky 7

我建议不要使用@Transactional,因为它将整个操作包装在JPA事务中.更接近db调用启动事务会更有效.

我更喜欢在服务级别启动事务.另外需要注意的是,db调用是一个阻塞进程,因此必须在默认操作上下文之外执行.

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

另请阅读有关播放线程池的信息,请访问https://www.playframework.com/documentation/2.4.x/ThreadPools#Using-other-thread-pools

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

  • 能够在控制器中的动作以外的其他方法上使用 @Transactional 注释会很好。这个 `JPA.withTransaction(() -> { ...` 对我来说总是有点难看。 (2认同)