@Transactional如何在Play中的控制器外工作!框架?

时间:2015-09-15 10:38:13

标签: playframework playframework-2.0 guice

我试图在Play!中使用注释(Guice)来实现我自己的方法拦截器。但是,如果包含的类是由Guice(reference)创建的,那么这些注释似乎只能起作用(因此也是拦截)。这让我想到了一个问题:@Transactional如何在Play中的Controller类之外工作!?它本质上是一个方法拦截器,无论如何创建包含类,它都可以正常工作?我也可以在我的模型和服务类中使用它。

1 个答案:

答案 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。