2010-11-27 2 views
16

Я новичок в спящем и весеннем. Я понял о демаркации транзакций спячки (по крайней мере, я так думаю). Но после кодирования несколько способа, как это:Как интегрировать весну с сеансом спящего режима и управлением транзакциями?

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

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

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

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

<tx:annotation-driven transaction-manager="transactionManager" /> 

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

@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:

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
"-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 
    <session-factory> 
     <!-- JDBC connection pool (use the built-in) --> 
     <property name="connection.pool_size">1</property> 
     <!-- SQL dialect --> 
     <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 
     <!-- Enable Hibernate's automatic session context management --> 
     <property name="current_session_context_class">thread</property> 
     <!-- Disable the second-level cache --> 
     <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 
     <!-- Echo all executed SQL to stdout --> 
     <property name="show_sql">true</property> 
     <!-- Drop and re-create the database schema on startup --> 
     <property name="hbm2ddl.auto">update</property> 

     <!-- all my mapping resources here --> 
    </session-factory> 
</hibernate-configuration> 

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

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

+0

Показать свой `hibernate.cfg.xml`. – axtavt 2010-11-27 18:20:21

ответ

15

Удалить следующую строку, она мешает Спринг-управляемые операции:

<property name="current_session_context_class">thread</property> 
+0

Это хорошо работает, спасибо за помощь. – Hery 2010-11-30 01:24:50

1

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

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

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

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