Как интегрировать весну с сеансом гибернации и управлением транзакциями?

Я новичок в спячке и весне. Я понял о демаркации транзакций спячки (по крайней мере, я так думаю). Но после кодирования нескольких таких методов:

sessionFactory.getCurrentSession().beginTransaction(); //do something here sessionFactory.getCurrentSession().endTransaction(); 

Я начал хотеть избежать этого и хочу, чтобы он автоматически выполнялся вне моего метода, так что я только пишу часть «// сделай что-нибудь здесь». Я прочитал о TransactionProxyFactoryBean и думаю, что xml-конфигурация очень длинная и должна повторяться для КАЖДОГО classа, я хочу сделать транзакцию, поэтому, если возможно, я хочу избежать ее использования.

Я попытался использовать @Transactional, но он вообще не работает. У меня эти строки в моем applicationContext.xml

          

и я уже пометил свои classы обслуживания @Transactional, но всегда получаю «xxx недействителен без активных транзакций». Вот пример кода, который дает мне ошибку (выполняется в модульном тесте btw):

 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:applicationContext.xml" }) @TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) public class UserServiceTest { @Resource private UserService userService; @Test public void testAddUser() { User us = new User(); us.setName("any name"); userService.addUser(us); } } к @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:applicationContext.xml" }) @TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) public class UserServiceTest { @Resource private UserService userService; @Test public void testAddUser() { User us = new User(); us.setName("any name"); userService.addUser(us); } } 

В этом случае точное сообщение об ошибке: «org.hibernate.HibernateException: сохранение недействительно без активной транзакции».

UPDATE : я попытался вызвать метод userService.addUser () из внешних модульных тестов (т. Е. Из реального веб-приложения), и я тоже получил ту же ошибку.

Это мой hibernate.cfg.xml:

      1  org.hibernate.dialect.MySQLDialect  thread  org.hibernate.cache.NoCacheProvider  true  update    

Класс userService помечен @Transactional. Я использую hibernate 3.3.2 и весну 2.5.6.

Могу ли я посоветовать, как это исправить?

Удалите следующую строку, она препятствует транзакциям, управляемым Spring:

 thread 

@hephestos: значение параметра current_session_context_class определяет контекст, с которым должен быть связан сеанс (сеанс Hibernate).

По умолчанию он связан с текущим streamом. Но когда «jta» используется для управления транзакциями, изменение значения этого параметра на «jta» связывает сеанс с текущим контекстом транзакции JTA.

В основном он определяет контекст для сеансов. Дополнительная информация: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/architecture.html#architecture-current-session

  • Операционная система Android
  • Что произойдет, если вы не совершаете транзакцию с базой данных (скажем, SQL Server)?
  • Соответствующий шаблон является строгим, но для элемента 'tx: annotation-driven'
  • Структура Entity Framework и уровень изоляции транзакций
  • Фиксация «Тайм-аут блокировки ожидания превышен; попробуйте перезапустить транзакцию «за« застрявшую »таблицу Mysql?
  • Как обойти отсутствие транзакций в MongoDB?
  • Oracle: как узнать, ожидает ли транзакция?
  • Вам нужна транзакция базы данных для чтения данных?
  • Понимание транзакций Spring. Что происходит, когда транзакционный метод вызывает другой транзакционный метод?
  • javax.transaction.Transactional vs org.springframework.transaction.annotation.Transactional
  • Каков «лучший» способ делать распределенные транзакции в нескольких базах данных с использованием Spring и Hibernate
  • Давайте будем гением компьютера.