2016-08-25 6 views
2

Я понимаю, этот вопрос задавали много раз, но большинство из них не может объяснить мою проблему:Hibernate - не удалось получить транзакции синхронизированные сессии для текущего потока

@RequestMapping("/testing") 
public String testing(HttpServletRequest request, final ModelMap model) 
{ 
    Transaction ut = session.openSession().beginTransaction(); 

    session.getCurrentSession(); // error here 

    ut.commit(); 

    return "testing"; 
} 

Почему я получаю ошибку

Could not obtain transaction-synchronized Session for current thread. 

Если я аннотирую метод с @Transactional, он работает отлично. Потому что у меня @EnableTransactionManagement в моем весеннем контексте.

Я хочу попробовать что-то, чтобы понять разницу между getCurrentSession и openSession, поэтому я создал тестовый пример выше.

getCurrentSession вызывается внутри активного контекста транзакций, почему он все еще бросает мне ошибку ???

См. Код от this.

ответ

0

OK, после столь долгого времени исследований, я узнал, что у меня есть пропустить paragraph ниже:

Вы не будете видеть эти фрагменты кода в регулярном применении; fatal (системные) исключения всегда должны быть пойманы на «вершине». В других словах код, который выполняет вызовы Hibernate в уровне персистентности , и код, который обрабатывает RuntimeException (и обычно может только очистка и выход), находятся в разных слоях. Текущий контекст Управление Hibernate может значительно упростить этот дизайн , обращаясь к SessionFactory. Обработка исключений обсуждается ниже в этой статье.

Так пример, показывающий, там действительно не будет работать в обычном сценарии ...

я должен делать, как показано ниже:

// BMT idiom with getCurrentSession() 
try { 
    UserTransaction tx = (UserTransaction)new InitialContext() 
          .lookup("java:comp/UserTransaction"); 

    tx.begin(); 

    // Do some work on Session bound to transaction 
    factory.getCurrentSession().load(...); 
    factory.getCurrentSession().persist(...); 

    tx.commit(); 
} 
catch (RuntimeException e) { 
    tx.rollback(); 
    throw e; // or display error message 
} 

Что значит, использование getCurrentSession является довольно ограниченным , он должен работать в транзакции active (и конкретной).

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

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