我有一个如下界面:
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中注入您的服务并调用它.