我有一个如下界面:
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
有没有办法正确完成这项工作?
答案 0 :(得分:2)
默认情况下,Spring使用代理。这意味着@Transaction
仅在从类外部调用方法时起作用。
要修复它,请提取您的服务方法。在MyWorker
中注入您的服务并进行调用。
答案 1 :(得分:0)
我认为您需要将@Transactional
注释添加到方法