Как интегрировать весну с сеансом гибернации и управлением транзакциями?
Я новичок в спячке и весне. Я понял о демаркации транзакций спячки (по крайней мере, я так думаю). Но после кодирования нескольких таких методов:
sessionFactory.getCurrentSession().beginTransaction(); //do something here sessionFactory.getCurrentSession().endTransaction();
Я начал хотеть избежать этого и хочу, чтобы он автоматически выполнялся вне моего метода, так что я только пишу часть «// сделай что-нибудь здесь». Я прочитал о TransactionProxyFactoryBean и думаю, что xml-конфигурация очень длинная и должна повторяться для КАЖДОГО classа, я хочу сделать транзакцию, поэтому, если возможно, я хочу избежать ее использования.
Я попытался использовать @Transactional, но он вообще не работает. У меня эти строки в моем applicationContext.xml
- Как откатить транзакцию базы данных при тестировании служб с помощью Spring в JUnit?
- TransactionScope с файлами в C #
- Где принадлежит аннотация @Transactional?
- EJB-транзакции в локальных методах-вызовах
- TransactionScope автоматически переходит на MSDTC на некоторых машинах?
и я уже пометил свои 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.
Могу ли я посоветовать, как это исправить?
- Откат вложенной / дочерней транзакции
- Дублирование fragmentов на транзакции fragmentов
- Являются ли функции PostgreSQL транзакционными?
- Firebase runTransaction не работает - MutableData имеет значение null
- Как TransactionScope откатывает транзакции?
- EJB 3.0 - Вложенная транзакция! = Требуется Новое?
- Django: как я могу защитить от одновременной модификации записей в базе данных
- Использование транзакций или SaveChanges (false) и AcceptAllChanges ()?
Удалите следующую строку, она препятствует транзакциям, управляемым 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