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 :

[Spring/Hibernate] RollBack sur plusieurs ajouts [Data]


Sujet :

Spring Java

  1. #1
    Membre régulier Avatar de eracius
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 138
    Points : 81
    Points
    81
    Par défaut [Spring/Hibernate] RollBack sur plusieurs ajouts
    Bonjour,

    Je me suis mis à Spring et Hibernate il y a quelques jours pour rendre l'application sur laquelle je travaille plus "pro".
    J'ai donc commencé à mettre en place une couche d'accès aux données avec des services simples pour les tester. Mes premiers essais sont concluants néanmoins je n'arrive pas à mettre un rollback en place pour une fonction d'ajout. Je tente d'ajouter deux objets dans mon DAO et de faire planter le deuxième pour vérifier que le premier est bien rollbacké. Mais ce n'est pas le cas.

    Tout d'abord mes config spring sont les suivantes :

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
     
    <beans>
     
    	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    		<property name="configLocation">
    			<value>classpath:hibernate.cfg.xml</value>
    		</property>
    		<property  name="configurationClass">
      			 <value>org.hibernate.cfg.AnnotationConfiguration</value>
    		</property>
    	</bean>
     
    	<bean id="myTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"	>
    		<property name="sessionFactory">
    			<ref bean="sessionFactory"/>
    		</property>
    	</bean>
     
    	<bean id="transactionProxy" abstract="true"
    		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    		<property name="transactionManager">
    			<ref bean="myTransactionManager"/>
    		</property>
    		<property name="transactionAttributes">
    			<props>
    				<prop key="insert*">PROPAGATION_REQUIRED</prop>
    				<prop key="update*">PROPAGATION_REQUIRED</prop>
    				<prop key="save*">PROPAGATION_REQUIRED</prop>
    				<prop key="*">PROPAGATION_REQUIRED, readOnly</prop>
    			</props>
    		</property>
    	</bean>		
     
    	<bean id="noeudDao" class="dao.hibernate3.NoeudDaoImpl">
    		<property name="sessionFactory">
    			<ref bean="sessionFactory" />
    		</property>
    	</bean>
     
    	<bean id="noeudManagerTarget" class="service.impl.NoeudManagerImpl">
    		<property name="noeudDao">
    			<ref bean="noeudDao" />
    		</property>
    	</bean>
     
    	<bean id="noeudManager" parent="transactionProxy">
    		<property name="transactionManager">
    			<ref bean="myTransactionManager"/>
    		</property>
    		<property name="target">
    			<ref bean="noeudManagerTarget"/>
    		</property>
    		<property name="transactionAttributeSource">
    			<bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/>
    		</property>
    	</bean>	
    </beans>
    noeudDao est mon interface DAO implémenté par la classe NoeudDaoImpl :

    noeudDao

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface NoeudDao {
    	public boolean Ajout(String type, Hashtable tableValeurs);
    }
    noeudDaoImpl

    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
     
    public class NoeudDaoImpl extends HibernateDaoSupport implements NoeudDao {
     
    	public boolean Ajout(String type, Hashtable tableValeurs) throws DataAccessException{
    		if (null == type || null == tableValeurs) {
    			throw new IllegalArgumentException("type and tableValeurs are mandatory. Null values are forbidden.");
    		}			
    				logger.info("Accès à l'objet de type : "+type);
     
    				Noeud noeud = new Noeud();
    				noeud.setEtat("0");
    				noeud.setIdnoeud("080808080808");
    				noeud.setNumnoeudpere("0102030405");
     
    				Noeud noeud1 = new Noeud();
     
    				getHibernateTemplate().saveOrUpdate(noeud);
    				getHibernateTemplate().saveOrUpdate(noeud1);
     
    				return true;
     
    	}
    }
    On peut voir dans ma fonction Ajout() que je créé deux objets Noeud, le premier est correct, le deuxième n'a pas d'idnoeud et donc provoque une exception DataAccessException sur la fonction saveorupdate().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    2007-10-31 09:58:00 ERROR [UserManagerImpl] Exception - DataAccessException occurs : ids for this class must be manually assigned before calling save(): donnees.Noeud; nested exception is org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): donnees.Noeud on complete Ajout().
    Néanmoins le premier Noeud est tout de même comité.

    Voici le code de mon service qui appelle ce DAO.

    NoeudManager (interface du service)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @Transactional (readOnly=false, propagation=Propagation.REQUIRED)
    public interface NoeudManager {
     
    	public boolean Ajout(String type, Hashtable tableValeurs);
    }
    Implémentation NoeudManagerImpl

    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
     
    public class NoeudManagerImpl implements NoeudManager {
     
        private final Log logger = LogFactory.getLog(UserManagerImpl.class);
     
        private NoeudDao noeudDao = null;
     
        public void setObjectDao(NoeudDao objectDao){
        	this.noeudDao = objectDao;
        }
     
        public boolean Ajout(String type, Hashtable tableValeurs) {
    		try{
    			return noeudDao.Ajout(type, tableValeurs);
    		}
    		catch(DataAccessException e) {
    			// Critical errors : database unreachable, etc.
    			logger.error("Exception - DataAccessException occurs : "+e.getMessage()
    					+" on complete Ajout().");
     
    			return false;
    		}
    	}
    }
    D'après ce que j'ai compris de mes lectures, la DataAccessException devrait provoquer le rollback de la session en cours.
    Mais j'ai surement pas compris un truc.

    J'espère avoir été clair.
    Merci d'avance pour votre aide.

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Points : 6 301
    Points
    6 301
    Par défaut
    Pour que la transaction soit rollbacké, il faut que l'exception soit remontée jusqu'au proxy.

    Or ici, tu catch l'exception toi meme, donc pour le proxy, tout c'est bien déroulé, donc pas besoin de faire de rollback

  3. #3
    Membre régulier Avatar de eracius
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 138
    Points : 81
    Points
    81
    Par défaut
    Effectivement, si je vire le try/catch ça marche (ça me rappelle que je l'avais constaté hier déjà ..)

    Seulement si je ne catch pas l'erreur à un moment ou un autre, elle fait planter mon appli. Comment éviter ça ?

  4. #4
    Membre régulier Avatar de eracius
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 138
    Points : 81
    Points
    81
    Par défaut
    Question idiote, il suffit de catcher un niveau plus haut, à l'appelle de la fonction du service ..

    Merci pour ton aide et désolé de ma stupidité

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

Discussions similaires

  1. Contrôle de plusieurs champ sur un ajout de ligne
    Par nawak.seb dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/11/2008, 11h31
  2. foreign-key sur plusieurs colonnes (Hibernate 3)
    Par ep31 dans le forum Hibernate
    Réponses: 1
    Dernier message: 27/10/2008, 15h00
  3. Ajouter des informations sur plusieurs tables
    Par nana 69 dans le forum IHM
    Réponses: 6
    Dernier message: 08/07/2008, 10h39
  4. hibernate-criteria : jointure sur plusieurs tables
    Par loic72 dans le forum Hibernate
    Réponses: 9
    Dernier message: 24/09/2007, 17h27
  5. [Hibernate] Héritage sur plusieurs niveaux
    Par srvremi dans le forum Hibernate
    Réponses: 2
    Dernier message: 31/05/2006, 18h39

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