我正在尝试将我的Play应用程序与数据库连接,我正在遵循controller-> service-> DAO图层样式。
@Transactional注释应该放在哪里。在控制器操作方法中,还是可以将其放在服务层类级别/方法级别中。
我尝试在一个Service层类的方法中保留@Transactional注释,并且它抛出了运行时错误。
[RuntimeException:在上下文中找不到EntityManager。尝试 用@ play.db.jpa.Transactional]
注释你的动作方法
那么,我们是否只能在控制器操作之上使用@Transactional?我正在使用2.4.2版本。如果是,为什么?当我在服务层调用我的DAO时,实际的数据库操作将在服务层开始而不是在控制器中我想。在控制器中,我只是调用服务层。
答案 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