5

我们正在使用 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 服务调用以使其正常工作。

4

1 回答 1

6

由于您CreateAlertJob不是由 Spring 创建的,@Transactional因此它不会生效。

您有以下选择:

于 2013-08-19T21:27:41.260 回答