我试图在Play!中使用注释(Guice)来实现我自己的方法拦截器。但是,如果包含的类是由Guice(reference)创建的,那么这些注释似乎只能起作用(因此也是拦截)。这让我想到了一个问题:@Transactional如何在Play中的Controller类之外工作!?它本质上是一个方法拦截器,无论如何创建包含类,它都可以正常工作?我也可以在我的模型和服务类中使用它。
答案 0 :(得分:3)
@Transactional不在控制器外工作。您唯一的方法是使用JPA.withTransaction
示例:
public Promise<Integer> doWork() {
return promise(() -> jpaApi.withTransaction(() -> {
return JPA.em()
.createNativeQuery("DELETE FROM table WHERE id=1")
.executeUpdate();
}), dbExecutionContext);
}
甚至没有额外的执行上下文(在调用者线程中执行):
public Promise<Integer> doWork() {
return jpaApi.withTransaction(() -> {
return JPA.em()
.createNativeQuery("DELETE FROM table WHERE id=1")
.executeUpdate();
});
}
别忘了注入play.db.jpa.JPAApi。