在Play

时间:2015-09-07 16:42:18

标签: playframework playframework-2.0

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

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

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

  

[RuntimeException:在上下文中找不到EntityManager。尝试   用@ play.db.jpa.Transactional]

注释你的动作方法

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

1 个答案:

答案 0 :(得分: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