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 :

[Probleme de transaction] Spring. [Data]


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 84
    Par défaut [Probleme de transaction] Spring.
    Bonjour,

    J'ai le DAO suivant :

    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
    57
    58
    59
    60
    61
     
    public class UserDAO extends HibernateDaoSupport implements IUserDAO{
     
    	/**
             * Log.<br/>
             */
    	private Log log = LogFactory.getLog(UserDAO.class);
     
     
    	public UserDAO() {
     
    	}
     
     
    	/**
             * 
             */
    	public void create(UserPersistanceBean user) throws PersistanceException {
    		try {
    		    Session session = this.getHibernateTemplate().getSessionFactory().getCurrentSession();
     
    			session.save(user);
    			log.info(new StringBuffer("Creation de l'utilisateur numero ").append(user.getIdUser()).toString());
    		} catch (Exception e) {
    			log.error(e, e);
    			throw new PersistanceException(e);
    		}
    	}
     
     
    	/**
             * 
             */
    	public UserPersistanceBean loadUserByLogin(String login) throws PersistanceException{
    		 UserPersistanceBean userPersistance = null;
     
    		 try{
    			 Session session = this.getHibernateTemplate().getSessionFactory().getCurrentSession();
    			 String requete = RequeteRessources.getRequeteRessources().getSQLRequest("loadUserByLogin");
    			 Query query = session.createQuery(requete);
    			 query.setParameter("login",login);
    			 List<UserPersistanceBean> listResult = query.list();
    			 if (listResult != null){
    				 if (listResult.size() > 1){
    					 throw new PersistanceException("Il y'a un utilisateur pour le login suivant");
    				 }
     
    				 if (listResult.size() == 1){
    					 userPersistance = listResult.get(0);					 
    				 }
    			 }
    		 }catch(Exception e){
    			 log.error(e,e);
    			 throw new PersistanceException(e);
    		 }
     
    		 return userPersistance;
    	}
     
     
    }
    Le service suivant :

    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
     
    public class UserBusinessService implements IUserBusinessService {
     
    	protected Log log = LogFactory.getLog(IUserBusinessService.class);
     
    	/**
             * UserDAO.<br/>
             */
    	private IUserDAO userDAO;
     
    	/**
             * RoleDAO.<br/>
             */
    	private IRoleDAO roleDAO;
     
    	public void createUser(UserBusinessBean user) throws LoginDejaExistantException, RoleNonExistantException, TechnicalException {
     
    		try {
     
    			// Conversion user business en user persistance
    			UserPersistanceBean userPersistance = UserHelper.getUserPersistanceFromBusiness(user);
     
    			// Verification que le login n'existe pas deja
    			UserPersistanceBean userPersiByLog = userDAO.loadUserByLogin(userPersistance.getLogin());
    			if (userPersiByLog != null) {
    				throw new LoginDejaExistantException("Le login existe deja.");
    			}
     
    			// Verification que le role existe vraiment
    			RolePersistanceBean rolePersistance = userPersistance.getRole();
    			if (((rolePersistance != null) && (rolePersistance.getLabelRole() != null) && (!rolePersistance.getLabelRole().equals("")))) {
    				RolePersistanceBean rolePersistanceRecup = roleDAO.loadRoleByLabel(rolePersistance.getLabelRole());
    				if (rolePersistanceRecup == null) {
    					throw new RoleNonExistantException("Le role de l'utilisateur n'existe pas.");
    				}
    				userPersistance.setRole(rolePersistanceRecup);
    			}
    			// Creation de l'utilisateur.
    			userDAO.create(userPersistance);
     
    			// Envoi d'un email de confirmation.
    			//this.sendEMailConfirmationCreationUser(user);
     
    		} catch (RoleNonExistantException e) {
    			log.info(e, e);
    			throw e;
    		} catch (LoginDejaExistantException e) {
    			log.info(e, e);
    			throw e;
    		} catch (Exception e) {
    			log.error(e, e);
    			throw new TechnicalException(e);
    		}
     
    		// TODO : Send mail.
    	}
    et le fichier applicationContext.xml suivant :

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
     
    	<!--    DataSource -->
    	<bean id="livreDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    		<property name="jndiName">
    			<value>java:/livreDb</value>
    		</property>
    	</bean>
     
    	<bean id="sessionFactoryBean" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    		<property name="dataSource">
    			<ref local="livreDataSource" />
    		</property>
     
    		<property name="hibernateProperties">
    			<props>
    				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
    				<prop key="hibernate.show_sql">true</prop>
    				<prop key="hibernate.connection.autocommit">false</prop>
    			</props>
    		</property>
    		<property name="mappingResources">
    			<list>
    				<value>fr/livre/persistance/user/User.hbm.xml</value>
    				<value>fr/livre/persistance/user/Role.hbm.xml</value>
    			</list>
    		</property>
    	</bean>
     
    	<!--    DAO -->
    	<bean id="userDAO" class="fr.livre.persistance.dao.user.UserDAO">
    		<property name="sessionFactory">
    			<ref local="sessionFactoryBean" />
    		</property>
    	</bean>
     
    	<bean id="roleDAO" class="fr.livre.persistance.dao.user.RoleDAO">
    		<property name="sessionFactory">
    			<ref local="sessionFactoryBean" />
    		</property>
    	</bean>
     
    	<!--  Couche metier -->
    	<bean id="userServiceTarget"
    		class="fr.livre.business.user.UserBusinessService">
    		<property name="userDAO">
    			<ref local="userDAO" />
    		</property>
     
    		<property name="roleDAO">
    			<ref local="roleDAO" />
    		</property>
    	</bean>
     
    	<!--  Gestionnaire de transaction. -->
    	<bean id="serviceManager"
    		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    		<property name="dataSource">
    			<ref local="livreDataSource" />
    		</property>
    	</bean>
     
    	<!-- Service avec support de transaction -->
    	<bean name="userService"
    		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    		<property name="transactionManager">
    			<ref local="serviceManager" />
    		</property>
     
    		<property name="target">
    			<ref local="userServiceTarget" />
    		</property>
     
    		<property name="transactionAttributes">
    			<props>
    				<prop key="createUser">PROPAGATION_REQUIRED,
    				-fr.livre.business.exception.LoginDejaExistantException,
    				-fr.livre.business.exception.RoleNonExistantException,
    				-fr.livre.business.exception.TechnicalException
    				</prop>
    			</props>
    		</property>
    	</bean>
    </beans>
    Aprés avoir exposé mon code, j'aurai quelques questions (Je me suis servi de tutorial pour le fichier applicationContext.xml) :

    1 - Dans le fichier applicationContext.xml, la datasource est crée par spring il me semble. Peux t'on se servir de la datasource crée par le serveur application (Qui je suppose est plus efficace). Si oui, comment peux t'on faire?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <bean id="livreDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    		<property name="jndiName">
    			<value>java:/livreDb</value>
    		</property>
    </bean>
    2 - J'aimerai gérer les transactions. J'avais fait une première version avec les transactions et hibernate et ceux ci étaient bien gérés. Je suis passé à spring et hibernate et justement j'ai eu envie de gérer aussi les transactions. Malheureusement, celui ci commite tout le temps même en cas d'exception().
    - J'ai pensé mettre autocommit à false mais la c'est le contraire. Ils commitent jamais.

    Je vous remercie de votre aide (Autre que google est ton ami).

    Koko22

  2. #2
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Par défaut
    Essaie avec le Hibernate TransactionManager

    Je ne sais pas si cela va regler le soucis, mais peut etre
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 84
    Par défaut
    Bonjour Hikage,

    Merci pour ta réponse mais j'ai pas compris en quoi Hibernate TransactionManager va résoudre mon soucis car dans les tutoriaux, ils utilisent
    TransactionProxyFactoryBean et ca a l'air de marcher.
    Je précise juste que le commit se fait à l'éxecution de la requete et non au commit géré par TransactionProxyFactoryBean.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 84
    Par défaut
    Le commit doit se faire à la fin de la transaction.

  5. #5
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Par défaut
    Tu continue d'utiliser TransactionProxyFactoryBean, mais avec comme transactionManager une référence vers un HibernateTransactionManager.

    Essaie au moins, et dis nous si cela fonctionne.
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 84
    Par défaut
    Bonjour Hikage,

    J'essaye ce soir et je te tiens au courant.

    Merci bcoup pour ton aide.

    Koko22

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 84
    Par défaut
    Pour le point 2, effectivement avec TransactionManager , ca marche. Merci Hikage.

    Par contre, pour le point 1, on peut vraiment pas utiliser la datasource du serveur application.

  8. #8
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Par défaut
    Désole j'ai zappé cette question.

    Normalement, si on peut, et de mémoire c'est bien avec le org.springframework.jndi.JndiObjectFactoryBean.

    Cela ne marche pas?
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 84
    Par défaut
    Bonjour Hickage,

    Effectivement ca marche trés bien mais je pensais que le datasource utilisé par le serveur d'application n'était pas la même que celle défini par Spring.
    J'ai peut être faux mais c juste à titre informatif et pour avoir de bonnes performances.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 84
    Par défaut
    Ma question n'a pas de sens. Effectivement, la datasource utilisé par spring est la même que celle définie dans le serveur d'application..
    Pour la retrouver, spring doit faire un lookup.

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

Discussions similaires

  1. [Data] transaction + spring 2.5 + annotations
    Par zorro13 dans le forum Spring
    Réponses: 1
    Dernier message: 28/11/2008, 12h28
  2. Hibernate : Problemes de transactions
    Par publicStaticVoidMain dans le forum Hibernate
    Réponses: 11
    Dernier message: 06/03/2008, 12h10
  3. [Data] Probleme sur les transactions spring
    Par guiso dans le forum Spring
    Réponses: 10
    Dernier message: 17/01/2007, 17h36
  4. Probleme de transaction sous sql 2000
    Par issou dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 05/12/2006, 15h11
  5. Réponses: 1
    Dernier message: 12/06/2006, 19h02

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