我想使用Quartz,Spring和Hibernate創建動態作業。用戶與Web服務交互,以創建就業這一類的:Spring + Hibernate + Quartz:Dynamic Job
public class StartJobSpring extends QuartzJobBean {
private String jobId;
private String jobType;
@Autowired
private NoaJobInstancesDAO njiDAO;
@Transactional
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
JobKey key = context.getJobDetail().getKey();
JobDataMap dataMap = context.getMergedJobDataMap();
// some logic
njiDAO.create(instanceUUID, noaJob.getNoaJob(jobId), jobType);
}
}
的NoaJobInstancesDAO是一個簡單的DAO類,這使得使用Hibernate的的EntityManager的:
@Repository
public class NoaJobInstancesDAOHibImpl implements NoaJobInstancesDAO {
@PersistenceContext
private EntityManager entityManager;
@Override
@Transactional
public NoaJobInstanceJPA create(NoaJobInstanceJPA entity) {
entityManager.persist(entity);
return entity;
}
@Override
public void create(String instance_uuid, NoaJobJPA job, String job_type) {
NoaJobInstanceJPA entity = new NoaJobInstanceJPA(instance_uuid, job,
job_type, "CREATED", null, null, "", "N", "N");
this.create(entity);
}
}
的問題是當這項工作發生時,拋出異常:
javax.persistence.TransactionRequiredException: No transactional EntityManager available
我無法理解爲什麼! 我安排這樣的工作在經理類
JobDetail job = newJob(StartJobSpring.class).withIdentity(//anId)
.setJobData(//aJobMap).build();
getScheduler().getObject().scheduleJob(job, trigger);
其中調度連線到經理爲
@Autowired
private ApplicationContext applicationContext;
@Bean
SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource, JpaTransactionManager transactionManager) {
SchedulerFactoryBean bean = new SchedulerFactoryBean();
AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
jobFactory.setApplicationContext(applicationContext);
bean.setJobFactory(jobFactory);
bean.setTransactionManager(transactionManager);
return bean;
}
類AutowiringSpringBeanJobFactory相同Autowiring。
在我的視角中,調度程序的接線有問題。實際上,我不明白我如何檢索應用程序上下文。
EDIT1:應用程序上下文似乎正確實例化。問題不可能在那裏。
EDIT2:我正在使用一個配置bean(不是xml文件)。這裏的主要方法:
@Bean
LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource);
entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
entityManagerFactoryBean.setPackagesToScan("package");
Properties jpaProperties = new Properties();
jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.OracleDialect");
jpaProperties.put("hibernate.show_sql", "false");
jpaProperties.put("hibernate.hbm2ddl.auto", "update");
entityManagerFactoryBean.setJpaProperties(jpaProperties);
return entityManagerFactoryBean;
}
@Bean
JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory);
return transactionManager;
}
@Bean
public NoaJobInstancesDAO noaJobInstancesDAO() {
NoaJobInstancesDAOHibImpl noaJobInstancesDAO = new NoaJobInstancesDAOHibImpl();
return noaJobInstancesDAO;
}
不確定我理解了。我用我的配置bean的主要方法更新了我的問題。我想你的意思是在我的DAO中添加@Autowired註釋,並在我的配置中添加另一個注入entityManagerFactory.createEntityManager()的bean。我對嗎? – dylaniato
是在您的DAO層,而不是注入EntityManager,注入EntityManagerFactory與Autowired註釋,並在您的方法,從entityManagerFactory.createEntityManager() – AntJavaDev
我會盡快嘗試獲取實體管理器。只是幾個問題。第一:我也在我的主線程中使用DAO。這種修改會影響我的正常流程嗎?第二:仍然可以使用createEntityManager()方法忽略事務管理? – dylaniato