мое приложение содержит Hibernate и Spring Framework, на сервере tamcat и mysql.
Я аннотировал функцию как транзакционную, и я увидел, что она не работает как трансакитональный метод (например, я вижу изменения в БДв браузере запросов, перед завершением функции).
метод выполняется из компонента, но в другом потоке, например:
executor.submit(new Runnable(){
@Override
public void run() {
someSpringService.doDbStuff();
}
});
внутри doDbStuff, я вызываю несколько методови каждый метод, использующий шаблон, например:
return getHibernateTemplate().execute(new HibernateCallback(){
public Object doInHibernate(Session session) throws HibernateException, SQLException {
return session.createCriteria(MyClass.class).add(Restrictions.eq("id", id))
.uniqueResult();
}
});
, иногда я также выполняю внутри собственного SQL-запроса HiberateCallback, используя сеанс, который я получаю в качестве аргумента для doInHiberate.
myвопросы - 1. аннотация транзакции игнорируется, потому что я использую другой поток?2. как я могу выполнить функцию, аннотированную с помощью транзакционной аннотации, как пружинный компонент (а не как обычную функцию - возможно, она решит 1)?3. если я создаю несколько HibernateCallback в пределах callstack, содержащего транзакционную аннотацию - это ведет себя как транзакционный метод?я должен использовать тот же сеанс и передать его между внутренними функциями?
спасибо ...