如何在后端线程中使用 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
中注入您的服务并调用它。
我的界面如下:
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
中注入您的服务并调用它。