IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

Problème gestion transactions spring/hibernate


Sujet :

Spring Java

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 13
    Points : 10
    Points
    10
    Par défaut Problème gestion transactions spring/hibernate
    Bonjour,

    Souhaitant gérer les transactions Hibernate grâce à Spring via un TransactionProxyFactoryBean, je bute sur un problème.

    Lorsque je souhaite acquérir mon objet de la couche coordination qui est pris en charge par TransactionProxyFactoryBean. cf ci dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    E01ListeSalarieSrv lSrv = (E01ListeSalarieSrv)ApplicationContextHolder.getContext().getBean("E01ListeSalarieSrv");
    Une "java.lang.ClassCastException: $Proxy0" est levée.

    E01ListeSalarieSrv est l'interface de mon service de coordination (classe abstraite).
    E01ListeSalarieSrvImpl est l'implémentation, c'est ce que je suis censé récupérer.

    Voici la déclaration de mon bean transactionnel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <bean id="E01ListeSalarieSrv" parent="baseTransactionProxy" >
    	<property name="target">
    		<bean name="E01ListeSalarieSrvTransactionTarget" class="com.renaud.salarie.presentation.web.coordination.E01.impl.E01ListeSalarieSrvImpl" />
    	</property>
    </bean>
    Voici mon springHibernate.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    <beans>
    	<!--  Déclaration de la DATASOURCES -->
     
    	<bean id="datasource"
    		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    		<property name="driverClassName" value="${db.driver}" />
    		<property name="url" value="${db.url}" />
    		<property name="username" value="${db.username}" />
    		<property name="password" value="${db.password}" />
    	</bean>
     
    	<!--  Déclaration Session Factory -->
     
    	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    		<property name="dataSource" ref="datasource" />
    		<property name="mappingResources">
    			<list>
    				<value>hibernate/mapping.hbm.xml</value>
    			</list>
    		</property>
    		<property name="hibernateProperties">
    			<props>
    				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
    				<prop key="hibernate.connection.pool_size">1</prop>
    				<prop key="hibernate.hbm2ddl.auto">update</prop>
    				<prop key="hibernate.show_sql">${db.show_sql}</prop>
     
    			</props>
    		</property>
    	</bean>
     
    	<!-- Hibernate Transaction Manager Definition -->
     
    	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    		<property name="sessionFactory">
    			<ref local="sessionFactory" />
    		</property>
    	</bean>
     
     
    	<!-- bean de base pour les transactions -->
    	<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
    		<property name="transactionManager" ref="transactionManager" />
    		<property name="transactionAttributes">
    			<props>
    				<prop key="insert*">PROPAGATION_REQUIRED</prop>
    				<prop key="update*">PROPAGATION_REQUIRED</prop>
    				<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
    				<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
    				<prop key="*">PROPAGATION_REQUIRED</prop>
    			</props>
    		</property>
    	</bean>
     
    </beans>
    J'ai farfouillé partout sur le net mais je ne trouve pas de solution. Merci d'avance !!

  2. #2
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Personne pour m'aider ... C'est une intégration classique d'hibernate avec Spring, il doit y avoir des centaines de personnes qui ont déjà mis en place ce système

  3. #3
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Quelle version de Spring utilises-tu ?

    Voici la déclaration de mon bean transactionnel.
    Elle me semble erronée, ou obsolète peut-être ?

    -> http://static.springsource.org/sprin...ansaction.html pour la 2.5 (a remplacer par 3.0.0 pour Spring 3).

    Tu dois tisser des aspects pour que ton bean soit derrière un proxy de transaction. L'exemple donné dans la doc est très bon.

  4. #4
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Oui c'est fort possible que je me sois basé sur un vieil exemple. J'ai suivi le tutoriel que tu m'as indiqué. J'ai mis en place la gestion de transaction via spring aop (copier/coller quoi).

    Mais il y a encore beaucoup de choses obscures pour moi.

    J'avais l'habitude, dans mes DAO, de gérer mes transactions comme un bourrin de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // Récupérer la session courante
       Session currentSession = HibernateUtil.getSessionFactory().getCurrentSession();
       // Récupérer la transaction courante
       Transaction transaction = currentSession.getTransaction()
     
    Criteria crit = lSession.createCriteria(Salarie.class);
    		crit.add(Restrictions.eq("archive", 0));
    		List<Salarie> lRetour = (List<Salarie>)crit.list();
     
       // Validation de la transaction
       transaction.commit();
    Maintenant que mes transactions sont gérées par spring au niveau de mes services de coordination. Que dois je faire concrètement dans mes DAO...
    Comment je récupère ma session pour créer des criteria ?

    Voici mon DAO et en suivant l'exception retournée quand la méthode donnerListeSalarie est appelée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    package com.renaud.salarie.persistance.salarie.impl;
     
    import java.util.List;
     
    import javax.transaction.TransactionManager;
     
    import org.hibernate.Criteria;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.criterion.Restrictions;
     
    import com.renaud.salarie.domaine.salarie.Salarie;
    import com.renaud.salarie.persistance.salarie.SalarieDao;
    import com.renaud.tech.hibernate.HibernateUtil;
     
    /**
     *
     */
    public class SalarieDaoImplNonIntrusive extends SalarieDao {
     
    @SuppressWarnings("unchecked")
    	@Override
    	public List<Salarie> donnerListeSalarie() {	
     
    		Session lSession = HibernateUtil.getSessionFactory().getCurrentSession();
     
    		Criteria crit = lSession.createCriteria(Salarie.class);
    		crit.add(Restrictions.eq("archive", 0));
    		List<Salarie> lRetour = (List<Salarie>)crit.list();
     
    		return lRetour;
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    GRAVE: "Servlet.service()" pour la servlet action a généré une exception
    org.hibernate.HibernateException: createCriteria is not valid without active transaction
    	at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:338)
    	at $Proxy36.createCriteria(Unknown Source)
    	at com.renaud.salarie.persistance.salarie.impl.SalarieDaoImplNonIntrusive.donnerListeSalarie(SalarieDaoImplNonIntrusive.java:51)
    Heeeeeeeeeeeeeelp me

    Code de mon spring :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    	<bean id="datasource"
    		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    		<property name="driverClassName" value="${db.driver}" />
    		<property name="url" value="${db.url}" />
    		<property name="username" value="${db.username}" />
    		<property name="password" value="${db.password}" />
    	</bean>
     
    	<!--  Déclaration Session Factory -->
     
    	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    		<property name="dataSource" ref="datasource" />
    		<property name="mappingResources">
    			<list>
    				<value>hibernate/mapping.hbm.xml</value>
    			</list>
    		</property>
    		<property name="hibernateProperties">
    			<props>
    				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
    				<prop key="hibernate.connection.pool_size">1</prop>
    				<prop key="hibernate.hbm2ddl.auto">update</prop>
    				<prop key="hibernate.show_sql">${db.show_sql}</prop>
    			</props>
    		</property>
    	</bean>
     
    	<!-- Hibernate Transaction Manager Definition -->
     
    	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    		<property name="sessionFactory" ref="sessionFactory" />
    	</bean>
     
    <tx:advice id="serviceTxAdvice" transaction-manager="transactionManager">
         <tx:attributes>
           <tx:method name="find*" propagation="REQUIRED" read-only="true" />
           <tx:method name="*" propagation="REQUIRED" />
         </tx:attributes>
       </tx:advice>
     
       <aop:config>
         <aop:pointcut expression="execution(* com.renaud.salarie.presentation.web.coordination..*.*(..))" id="servicesCoordination"/>
         <aop:advisor advice-ref="serviceTxAdvice" pointcut-ref="servicesCoordination" />
       </aop:config>

  5. #5
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Voilà ce que j'ai trouvé comme solution pour mon Dao, si vous pouviez me donner un avis sur la chose...du genre "oui c'est génial" ou "j'espère que tu ne va pas mettre ça en place dans ton activité professionnelle ".

    Le code des fichiers postés dans le post précédent n'ont pas changé. Hormis le DAO bien sur que voilà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public class SalarieDaoImplNonIntrusive extends SalarieDao {
     
    private HibernateTransactionManager hibernateTransactionManager;
     
    public Session getCurrentSession(){
    		if (hibernateTransactionManager == null)
    			hibernateTransactionManager = (HibernateTransactionManager)ApplicationContextHolder.getContext().getBean("transactionManager");
     
    		return hibernateTransactionManager.getSessionFactory().getCurrentSession();
    	}
     
    public List<Salarie> donnerListeSalarie() {	
     
    		Criteria crit = getCurrentSession().createCriteria(Salarie.class);
    		crit.add(Restrictions.eq("archive", 0));
    		List<Salarie> lRetour = (List<Salarie>)crit.list();
    		return lRetour;
    	}

Discussions similaires

  1. [Data] Problème de configuration Spring - Hibernate
    Par pschiit dans le forum Spring
    Réponses: 2
    Dernier message: 31/05/2013, 12h41
  2. Problème avec JSF + Spring + Hibernate
    Par chahrazedd dans le forum JSF
    Réponses: 1
    Dernier message: 31/07/2011, 16h38
  3. [Data] Gestion des transaction, Spring et Hibernate
    Par Babilion dans le forum Spring
    Réponses: 2
    Dernier message: 19/03/2010, 16h24
  4. [Data] Problème de transaction Spring Hibernate
    Par totoz dans le forum Spring
    Réponses: 0
    Dernier message: 01/07/2009, 17h21
  5. [Spring][Hibernate] Transaction déclarative
    Par mauvais_karma dans le forum Hibernate
    Réponses: 13
    Dernier message: 03/07/2008, 18h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo