2016-11-23 3 views
1

У меня есть фасоль с функцией @Transactional.Строгая альтернатива примечанию Spring @Transactional

public class ABean{ 
    @Transactional 
    public void method aMethod(){ 
    //do some job with Hibernate. 
    } 
} 

Но теперь мне нужно вызвать этот метод из другого метода, который должен быть назван не в контексте Spring (в Quartz контексте на самом деле):

public class ABean implements org.quartz.Job{ 

    @Transactional 
    public void method aMethod(){ 
    //do some job with Hibernate. 
    } 

    @Override 
    public void execute(JobExecutionContext context) throws JobExecutionException { 
    System.out.println("start..."); 
    //@Transactional annotation is ignored here 
    //so I have 'Could not obtain transaction-synchronized Session 
    //for current thread' exception. 
    aMethod(); 
    System.out.println("done"); 
    } 
} 

Как я понимаю аннотацию @Transactional просто как-то оборачивает метод с некоторым другим кодом. Итак, как я должен обернуть вызов aMethod(), чтобы вызвать его точно так же, как вызовы Spring?

+0

Возможный дубликат метода вызова метода Spring @Transaction методом одного и того же класса?] (Http://stackoverflow.com/questions/3423972/spring-transaction-method-call-by-the- method-in-the-same-class-does-not-wo) –

ответ

1

Весна только добавляет свою транзакционную логику, когда вы вызываете ее из другого компонента. При вызове метода из одного класса аннотация игнорируется.

Для вас это означает, что вы должны переместить aMethod() другому Bean и вызывать его из существующего ABean.

2

Вы можете использовать Транзакцию из Hibernate вместо этого, как вы сказали, этот метод не будет работать в среде Spring и использовать его программно. Создать объект Session из Hibernate SessionFactory. С сеанса вы можете получить транзакцию, используя session.beginTransaction(). Отъезд: Hibernate Docs

+0

Я не пробовал этот путь, но ваш ответ тоже выглядит. Спасибо. –

Смежные вопросы