【问题标题】:How do I use JpaRepository in a backend thread?如何在后端线程中使用 JpaRepository?
【发布时间】:2016-04-11 16:33:48
【问题描述】:

我有一个界面如下:

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

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

【问题讨论】:

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


    【解决方案1】:

    Spring 默认使用代理。这意味着@Transaction 仅在从类外部调用方法时才有效。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-26
        • 2014-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-04
        • 1970-01-01
        相关资源
        最近更新 更多