2013-08-19 278 views
5

Chúng tôi đang sử dụng Spring 3.1, JPA (qua Hibernate) và Quartz. Thông thường chúng ta tương tác với DB thông qua chú thích @PersistenceContext trên các bean Service, và một trong hai bộ điều khiển SpringMVC hoặc lệnh gọi dịch vụ do GraniteDS quản lý.Sử dụng PersistenceContext trong Công việc Thạch anh

Tôi đang viết một công việc Thạch anh cần tương tác với cơ sở dữ liệu. Tôi đã thử tất cả mọi thứ tôi có thể tìm thấy để làm việc này. Tôi đã thử truyền vào một thành phần Spring-managed (được chú thích bằng @PersistenceContext và @Transactional) thông qua jobMap, lệnh gọi đến entityManager.persist (o) thực thi, nhưng không có gì xảy ra trong cơ sở dữ liệu. Tôi cũng đã thử tương tự như this answer, tạo một lớp nhà máy để gọi autowireBean() trên đối tượng công việc. Tôi thiết lập lớp công việc như vậy:

public class CreateAlertJob implements Job { 

    @PersistenceContext 
    EntityManager entityManager; 

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

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

Kết quả tương tự, phương thức thực thi nhưng cơ sở dữ liệu không bị thay đổi. Tôi tìm thấy this blog post tham chiếu đến dự án GitHub. Hiện anh đang sử dụng JpaInterceptor để thiết lập một phiên Hibernate, nhưng điều này sử dụng mẫu DAO và tôi muốn gắn bó với việc sử dụng @PersistenceContext.

Rõ ràng có gì đó về sợi thạch anh ngăn cản điều này hoạt động đúng cách? Tôi sắp hết ý tưởng và cân nhắc thực hiện cuộc gọi dịch vụ web tới bộ điều khiển SpringMVC chỉ để làm việc này.

Trả lời

6

CreateAlertJob của bạn không được tạo bởi Spring, @Transactional trong đó không có hiệu lực.

Bạn có các tùy chọn sau:

+0

Tôi đã thử điều này ban đầu và nó không hoạt động nhưng rõ ràng có một số vấn đề khác đang diễn ra. Làm công việc trong một bean Spring có vẻ là lựa chọn tốt nhất, và đang hoạt động tốt. – NTyler