Stiamo utilizzando Spring 3.1, JPA (tramite Hibernate) e Quartz. In genere interagiamo con il DB tramite l'annotazione @PersistenceContext sui bean di servizio, i controller SpringMVC o il richiamo del servizio gestito da GraniteDS.Utilizzo di PersistenceContext in un processo al quarzo
Sto lavorando alla scrittura di un processo Quartz che deve interagire con il database. Ho provato tutto ciò che posso trovare per farlo funzionare. Ho provato a passare in un componente gestito da Spring (annotato con @PersistenceContext e @Transactional) tramite jobMap, la chiamata a entityManager.persist (o) viene eseguita, ma non accade nulla nel database. Ho anche provato simile a this answer, creando una classe factory per chiamare autowireBean() sull'oggetto di lavoro. Ho impostato la classe di lavoro in questo modo:
public class CreateAlertJob implements Job {
@PersistenceContext
EntityManager entityManager;
@Override
@Transactional
public void execute(JobExecutionContext context) throws JobExecutionException {
SomeEntity entity = new SomeEntity();
entityManager.persist(entity);
}
}
Stesso risultato, il metodo viene eseguito ma il database non viene modificato. Ho trovato this blog post che fa riferimento a un progetto GitHub. Lì sta usando JpaInterceptor per stabilire una sessione di Hibernate, ma questo usa il pattern DAO e vorrei usare @PersistenceContext.
Ovviamente c'è qualcosa nel thread del quarzo che impedisce che funzioni correttamente? Sto per perdere idee e prendere in considerazione l'idea di effettuare una chiamata di servizio web a un controller SpringMVC solo per farlo funzionare.
Inizialmente avevo provato e non funzionava, ma è chiaro che ci sono altri problemi in corso. Fare il lavoro in un fagiolo di primavera sembra l'opzione migliore e sta funzionando bene. – NTyler