Playframework 在何处放置@Transactional注释

Playframework 在何处放置@Transactional注释,playframework,playframework-2.0,Playframework,Playframework 2.0,我正在尝试将我的Play应用程序与数据库连接,我遵循控制器->服务->DAO层样式 @Transactional注释应该放在哪里。在控制器操作方法中,或者我可以将其放置在服务层类级别/方法级别 我尝试将@Transactional注释保留在服务层类的一个方法中,但它抛出了运行时错误 [运行时异常:在上下文中找不到EntityManager。请尝试 用@play.db.jpa.Transactional]注释您的操作方法 那么,我们是否必须仅在控制器操作之上使用@Transactional?我正在

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

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

我尝试将@Transactional注释保留在服务层类的一个方法中,但它抛出了运行时错误

[运行时异常:在上下文中找不到EntityManager。请尝试 用@play.db.jpa.Transactional]注释您的操作方法


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

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

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

看看简单的DAO+服务示例

在这里还可以阅读有关播放线程池的内容


此处描述的阻塞代码(db调用)处理:

如果能够在控制器中的操作之外的其他方法上使用@Transactional注释,那就太好了。这个
JPA.withTransaction(()->{…
在我看来总是有点难看。@Kris:正如问题中所写的“@Transactional”不允许在其他类中保留控制器动作方法。@srk我只是想表达我对这不可能的悲痛。它非常有用。我在Spring框架中使用它,它工作得相当好。@Zabugor:github链接有一些Java代码,返回promise(()->jpaApi.withTransaction()->我从未见过这种类型的语法。你能解释一下吗?或者直接使用该运算符的一些链接。是的。我已经用可读性更强的java 6兼容代码更新了要点,类似的java 6和java 8示例代码可以在这里找到