2013-08-19 1 views
5

Wir verwenden Spring 3.1, JPA (via Hibernate) und Quartz. Normalerweise interagieren wir mit der DB über die @PersistenceContext-Annotation für Service-Beans und entweder SpringMVC-Controller oder GraniteDS-verwalteten Serviceaufruf.Verwenden von PersistenceContext in einem Quartz-Job

Ich arbeite am Schreiben eines Quartz-Jobs, der mit der Datenbank interagieren muss. Ich habe alles versucht, was ich finden kann, damit das funktioniert. Ich habe versucht, eine Spring-verwaltete Komponente (kommentiert mit @PersistenceContext und @Transactional) über die JobMap, der Aufruf von entityManager.persist (o) ausgeführt, aber nichts passiert in der Datenbank. Ich versuchte auch ähnlich this answer, eine Fabrikklasse zu schaffen, um autowireBean() auf dem Arbeitsauftrag anzurufen. Ich richtete die Job-Klasse so ein:

public class CreateAlertJob implements Job { 

    @PersistenceContext 
    EntityManager entityManager; 

    @Override 
    @Transactional 
    public void execute(JobExecutionContext context) throws JobExecutionException { 

     SomeEntity entity = new SomeEntity(); 
     entityManager.persist(entity); 
    } 
} 

Gleiches Ergebnis, die Methode wird ausgeführt, aber die Datenbank ist unverändert. Ich habe this blog post gefunden, das auf ein GitHub-Projekt verweist. Dort verwendet er JpaInterceptor, um eine Hibernate-Sitzung zu erstellen, aber diese verwendet das DAO-Muster und ich möchte bei der Verwendung von @PersistenceContext bleiben.

Offensichtlich gibt es etwas über den Quarzfaden, der verhindert, dass dies richtig funktioniert? Mir geht es um Ideen und darüber, einen Web Service-Aufruf an einen SpringMVC-Controller zu machen, nur um das zu erreichen.

Antwort

6

Da Ihre CreateAlertJob nicht von Spring erstellt wird, wird @Transactional darin nicht wirksam.

Sie haben folgende Möglichkeiten:

+0

Ich hatte dies zunächst versucht und es hat nicht funktioniert, aber es ist klar, dass es einige andere Probleme gibt. Die Arbeit in einer Spring Bean zu tun, scheint die beste Option zu sein und funktioniert gut. – NTyler