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

我有一个如下界面:

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();

我能够很好地读取这个repo,但每当我保存并刷新时,我得到异常:

javax.persistence.TransactionRequiredException: no transaction is in progress

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

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

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

点赞