2013-08-19 16 views
5

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.

risposta

6

Poiché il vostro CreateAlertJob non è stato creato da Spring, @Transactional non ha effetto.

Sono disponibili le seguenti opzioni:

+0

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

Problemi correlati