Comment intégrer Spring avec la gestion des sessions d'hibernation et des transactions?

Je suis un débutant dans les deux hibernate et spring. J'ai compris à propos de la mise en veille prolongée la démarcation des transactions (du moins je le pense). Mais après le codage d'un peu de méthode comme ceci:

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

J'ai commencé à vouloir l'éviter et souhaitez qu'il soit fait automatiquement en dehors de ma méthode telle que je l'ai écris le "//faire quelque chose ici". J'ai lu sur la TransactionProxyFactoryBean et pense que la configuration xml est très long et doivent être répétées pour CHAQUE cours que je veux faire transactionnelle donc si possible je veux éviter de l'utiliser.

J'ai essayé d'utiliser le @Transactional, mais il ne fonctionne pas du tout. J'ai ces lignes dans mon 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" />

et je l'ai déjà marqué mon les classes de service avec @Transactional, mais j'ai toujours le "xxx n'est pas valide sans transaction active".
Voici un exemple de code qui me donne une erreur (à exécuter dans l'unité de test 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);
    }
}

Dans ce cas, le message d'erreur exact est: "org.mise en veille prolongée.HibernateException: enregistrer n'est pas valide sans transaction active".

Mise à JOUR: j'ai essayé d'appeler le userService.addUser() la méthode de l'extérieur de tests unitaires (c'est à dire à partir de la réalité de l'application web) et j'ai eu le même message d'erreur.

C'est mon 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>

La userService classe est marquée par @Transactionnelle. Je suis de l'utilisation d'hibernate 3.3.2 et le printemps 2.5.6.

Puis-je avoir quelques conseils sur la façon de résoudre ce problème?

source d'informationauteur Hery