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
Vous devez vous connecter pour publier un commentaire.
Supprimez la ligne suivante, il interfère avec le Printemps géré transactions:
@hephestos: La valeur pour le paramètre
current_session_context_class
décide le contexte dans lequel la session (session Hibernate) doit être lié avec.Par défaut, il est lié avec le thread en cours d'exécution. Mais quand "jta" est utilisé pour gérer les transactions, la modification de la valeur de ce paramètre à "jta" se lie à la session de l'actuel transaction JTA contexte.
Fondamentalement, il définit le contexte pour les sessions. Plus d'informations: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/architecture.html#architecture-current-session