【问题标题】:Using PersistenceContext in a Quartz Job在 Quartz 作业中使用 PersistenceContext
【发布时间】:2013-08-19 20:18:28
【问题描述】:

我们正在使用 Spring 3.1、JPA(通过 Hibernate)和 Quartz。通常,我们通过 Service bean 上的 @PersistenceContext 注释以及 SpringMVC 控制器或 GraniteDS 管理的服务调用与 DB 进行交互。

我正在编写一个需要与数据库交互的 Quartz 作业。我已经尝试了我能找到的一切来让它工作。我尝试通过 jobMap 传入 Spring 管理的组件(使用 @PersistenceContext 和 @Transactional 注释),对 entityManager.persist(o) 的调用执行,但数据库中没有任何反应。我也尝试过类似于this answer,创建一个工厂类来调用作业对象上的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);
    }
}

同样的结果,方法执行但数据库没有改变。我发现 this blog post 引用了一个 GitHub 项目。他在那里使用 JpaInterceptor 建立 Hibernate 会话,但这使用 DAO 模式,我想坚持使用 @PersistenceContext。

很明显,Quartz 线程有什么东西会阻止它正常工作?我几乎没有想法,正在考虑对 SpringMVC 控制器进行 Web 服务调用以使其正常工作。

【问题讨论】:

    标签: spring hibernate jpa quartz-scheduler


    【解决方案1】:

    由于你的CreateAlertJob不是Spring创建的,所以其中的@Transactional不会生效。

    您有以下选择:

    【讨论】:

    • 我最初尝试过这个,但它不起作用,但很明显还有其他一些问题正在发生。在 Spring bean 中完成这项工作似乎是最佳选择,并且运行良好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    相关资源
    最近更新 更多