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 avec le TransactionManager [Data]


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 117
    Par défaut Problème avec le TransactionManager
    Bonsoir,

    Je suis un peu paumé avec le Transaction manager. J'utilise Spring 2.5.5 et Hibernate 3.3.2

    Pour le moment, j'ai ce code qui fonctionne :
    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
    <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" >
    	    <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
    	    <property name="url" value="jdbc:hsqldb:mem:/openpronosdb"/>
    	    <property name="username" value="sa"/>
    	    <property name="password" value=""/>
    	</bean>
     
    	<bean id="mySessionFactory"
    	 class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    	    <property name="dataSource" ref="myDataSource"/>
    	    <property name="mappingResources">
    	        <list>
    	            <value>org/simon/openpronos/model/User.hbm.xml</value>
    	        </list>
    	    </property>
    	    <property name="hibernateProperties">
    	        <props>
    				<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
    				<prop key="hibernate.show_sql">false</prop>
    				<prop key="hibernate.current_session_context_class">thread</prop>
    			</props>
    	    </property>
    	</bean>
     
    	<bean id="securityDao" class="org.simon.openpronos.dao.SecurityDaoImpl">
    		<property name="sessionFactory" ref="mySessionFactory"/>
    	</bean>

    Dans ma classe SecurityDaoImpl j'ai ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Session session = sessionFactory.getCurrentSession();
    		session.beginTransaction();
    		User userAuthenticated = null;
     
    		Query query = session.createQuery("FROM User WHERE password='"+password+"' AND login='"+login+"'");
    		...
    Si je ne mets pas le session.beginTransaction(); j'ai une exception org.hibernate.HibernateException: createQuery is not valid without active transaction Je pensais, peut-être à tort, que Spring permettait de s'affranchir de démarrer/fermer les Transactions

    J'ai lu des tonnes d'aide sur l'utilisation des TransactionManager et au final, je suis complètement paumé. Visiblement il y a plusieurs façons de l'implémenter et c'est un peu dépendant de la version d'Hibernate qu'on utilise. Bref, je suis perdu.

    J'espère que c'est à peu près clair parceque j'ai la tête sans dessus dessous à force de lire des trucs différents.

  2. #2
    Membre Expert
    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
    Par défaut
    Spring permettait de s'affranchir de démarrer/fermer les Transactions
    Ouais, Spring te permet de ne pas écrire le code correspondant, sauf qu'il faut alors soit utiliser des annotations (@Transactional) soit de l'AOP (fichier de conf xml).

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 117
    Par défaut
    J'ai réussi à gérer les transactions via aop

    J'ai une autre question du coup : pourquoi ai-je essentiellement vu des configurations avec AOP basées la couche métier et pas uniquement sur la couche dao ?

    Les transactions vont toujours avoir lieu au niveau de la couche dao non ?

    Dans les tutos que j'ai lus, c'est très souvent une classe de service qui est référencée dans le xml de configuration et cette classe de service fait appel à la couche dao. Pourquoi ?

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Par défaut
    Parce que généralement, un service regroupe plusieurs accès aux données, donc plusieurs DAO et l'intérêt d'une transaction et de valider/annuler un ensemble d'accès à la base.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 117
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Parce que généralement, un service regroupe plusieurs accès aux données, donc plusieurs DAO et l'intérêt d'une transaction et de valider/annuler un ensemble d'accès à la base.
    Si je comprends bien, si je déclare la transaction au niveau du service qui regroupe trois dao, il va utiliser la meme transaction pour les trois dao : s'il y a un problème sur une des trois, il fera un rollback sur toute la transaction donc on reviendra bien dans l'état stable d'origine.
    Alors que si je déclare la transaction au niveau de la dao, il va utiliser trois transactions pour les trois dao ce qui peut poser problème si l'une d'elle échoue.

    C'est bien ça ou ce sont d'autres considérations qui interviennent ?

    Question subsidiare en relation avec tout ça : supposons que je développe de nouveaux éléments de la couche dao, comment je fais pour les tests unitaires (et du TDD plus généralement) si les transactions sont gérées au niveau des services ?

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Par défaut
    Oui c'est ça.
    Sachant que tu peux configurer tes transactions à la manière EJB : utiliser la transaction courante, en créer une nouvelle, etc.
    Il faut lire un peu la doc pour plus de précisions.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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