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

How do I use JpaRepository in a backend thread?

我的界面如下:

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

有什么方法可以正确完成这项工作吗?

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

Spring,默认使用代理。这意味着 @Transaction 仅在从 class.

外部调用方法时有效

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