在Quartz作业中使用PersistenceContext

NTy*_*ler 5 spring hibernate jpa quartz-scheduler

我们使用的是Spring 3.1,JPA(通过Hibernate)和Quartz.通常,我们通过Service Bean上的@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

同样的结果,该方法执行但数据库未更改.我发现这篇博文引用了一个GitHub项目.在那里他使用JpaInterceptor建立一个Hibernate会话,但这使用DAO模式,我想坚持使用@PersistenceContext.

显然有一些关于Quartz线程阻止它正常工作的东西?我想出了一些想法,并考虑将一个Web服务调用到一个SpringMVC控制器,只是为了让它工作.

axt*_*avt 6

因为你CreateAlertJob不是由Spring创建的,@Transactional所以它不会生效.

您有以下选择: