我尝试使用注解(Guice)在Play!中实现自己的方法拦截器,但似乎这些注解只有在由Guice创建的包含类中才能起作用(参考此处)。这就带来了一个问题:@Transactional在Play!中的Controller类之外如何工作?它本质上是一个方法拦截器,无论包含类如何创建都可以正常工作吗?我也可以在我的模型和服务类中使用它。
我尝试使用注解(Guice)在Play!中实现自己的方法拦截器,但似乎这些注解只有在由Guice创建的包含类中才能起作用(参考此处)。这就带来了一个问题:@Transactional在Play!中的Controller类之外如何工作?它本质上是一个方法拦截器,无论包含类如何创建都可以正常工作吗?我也可以在我的模型和服务类中使用它。
@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。
@Transaction
注释的服务例程,它似乎仍然可以工作。这是否意味着来自控制器任何位置的调用堆栈中的被调用者都可以使用@Transaction
进行注释,但是在控制器上下文之外的任何其他被调用者都不能? - Saksham Gupta@Transaction
的事实是有道理的。Play!使用Guice,而在Guice中,除非通过injector.getInstance()
调用创建包含注释的对象,否则无法调用基于注释的方法拦截器。Play!可以控制控制器对象的初始化,但不能控制任意对象的创建。 - Saksham Gupta