Playframework @Transactional如何在控制器外工作!框架

Playframework @Transactional如何在控制器外工作!框架,playframework,playframework-2.0,guice,Playframework,Playframework 2.0,Guice,我试图在游戏中使用注释(Guice)实现我自己的方法拦截器!。然而,似乎只有在包含类是由Guice()创建的情况下,这些注释才会起作用(并因此拦截)。这就引出了一个问题:@Transactional如何在控制器类之外工作呢!?它本质上是一个方法拦截器,无论包含类是如何创建的,它都可以正常工作?我也可以在我的模型和服务类中使用它。@Transactional在控制器之外不起作用。你唯一的方法就是使用 例如: public Promise<Integer> doWork() {

我试图在游戏中使用注释(Guice)实现我自己的方法拦截器!。然而,似乎只有在包含类是由Guice()创建的情况下,这些注释才会起作用(并因此拦截)。这就引出了一个问题:@Transactional如何在控制器类之外工作呢!?它本质上是一个方法拦截器,无论包含类是如何创建的,它都可以正常工作?我也可以在我的模型和服务类中使用它。

@Transactional在控制器之外不起作用。你唯一的方法就是使用

例如:

public Promise<Integer> doWork() {
    return promise(() -> jpaApi.withTransaction(() -> {
        return JPA.em()
            .createNativeQuery("DELETE FROM table WHERE id=1")
            .executeUpdate();
    }), dbExecutionContext);
}
public-Promise-doWork(){
返回承诺(()->jpaApi.withTransaction(()->{
返回JPA.em()
.createNativeQuery(“从id=1的表中删除”)
.executeUpdate();
}),dbExecutionContext);
}
或者即使没有额外的执行上下文(在调用线程中执行):

public-Promise-doWork(){
返回jpaApi.withTransaction(()->{
返回JPA.em()
.createNativeQuery(“从id=1的表中删除”)
.executeUpdate();
});
}

别忘了注入play.db.jpa.JPAApi。

不幸的是@Transactional只能用于控制器操作。您必须手动包装的任何其他方法。这个问题可能会有帮助:。嗯,这与我所看到的完全相反。如果调用带有
@Transaction
注释的服务例程,它似乎仍然可以工作。这是否意味着来自控制器中任何位置的调用堆栈中的被调用方都可以使用
@Transaction
进行注释,但控制器上下文之外的任何其他被调用方都不能这样做?如果从控制器中的带有@Transactional注释的操作中调用服务方法(整个控制器也可能被注释),那就行了。因此,如果您从不同的位置调用相同的服务方法,那么在注释操作之外,它将不起作用。在文件中,他们也只提到行动。很遗憾:任意方法中的事务性注释将是一个很好的特性(在Spring框架中没有问题)!不允许任意方法尊重
@Transaction
是有意义的。玩使用Guice,并且使用Guice,您不能调用基于注释的方法拦截器,除非包含注释的对象是由
injector.getInstance()
call创建的。玩可以控制控制器对象初始化,但不能控制任意对象创建。
public Promise<Integer> doWork() {
    return jpaApi.withTransaction(() -> {
        return JPA.em()
                .createNativeQuery("DELETE FROM table WHERE id=1")
                .executeUpdate();
    });
}