我们正在使用 Spring 3.1、JPA(通过 Hibernate)和 Quartz。通常,我们通过 Service beans 上的 @PersistenceContext 注释以及 SpringMVC 控制器或 GraniteDS 管理的服务调用与 DB 进行交互。
我正在编写一个需要与数据库交互的 Quartz 作业。我已经尝试了我能找到的一切来让它工作。我尝试通过 jobMap 传入 Spring 管理的组件(使用 @PersistenceContext 和 @Transactional 注释),对 entityManager.persist(o) 的调用执行,但数据库中没有任何反应。我也尝试过类似于这个答案,创建一个工厂类来调用作业对象上的 autowireBean() 。我这样设置工作类:
public class CreateAlertJob implements Job {
@PersistenceContext
EntityManager entityManager;
@Override
@Transactional
public void execute(JobExecutionContext context) throws JobExecutionException {
SomeEntity entity = new SomeEntity();
entityManager.persist(entity);
}
}
结果相同,方法执行但数据库未更改。我发现这篇博客文章引用了一个 GitHub 项目。他在那里使用 JpaInterceptor 建立 Hibernate 会话,但这使用 DAO 模式,我想坚持使用 @PersistenceContext。
显然,Quartz 线程有什么东西会阻止它正常工作?我几乎没有想法,正在考虑对 SpringMVC 控制器进行 Web 服务调用以使其正常工作。