如何在后端线程中使用JpaRepository?

时间:2016-04-11 16:33:49

标签: java multithreading spring-data spring-data-jpa

我有一个如下界面:

public interface PackageRepository extends JpaRepository<DocPackage, String> {
}

现在,我可以通过使用:

在我的REST服务中使用它而不会出现任何问题
@Resource
PackageRepository repo;

我可以毫无问题地进行交易调用。

但是,当我尝试从工作线程加载它时:

public class MyWorker implements Runnable {
    @Resource
    PackageRepository repo;

    @Transactional
    private void doSomething() {
        DocPackage pck = repo.findOne("key");
        pck.setStatus(2);
        repo.saveAndFlush(pck);
    }

    public void run() {
        //stuff
        doSomething();
        //other stuff
    }
}

new Thread(new MyWorker()).start();

我能够很好地读取这个仓库,但每当我保存并冲洗时,我都会得到异常:

javax.persistence.TransactionRequiredException: no transaction is in progress

有没有办法正确完成这项工作?

2 个答案:

答案 0 :(得分:2)

默认情况下,Spring使用代理。这意味着@Transaction仅在从类外部调用方法时起作用。

要修复它,请提取您的服务方法。在MyWorker中注入您的服务并进行调用。

答案 1 :(得分:0)

我认为您需要将@Transactional注释添加到方法