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

Hibernate Java Discussion :

Depuis l'ajout de Spring, saveOrUpdate() ne fonctionne plus


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Par défaut Depuis l'ajout de Spring, saveOrUpdate() ne fonctionne plus
    Bonjour,


    Depuis que j'ai rajouté Spring à mon projet, certaines requêtes ne fonctionnent plus.

    Dans ce cas,
    Il y a des contactes et des groupes qui ont une relation many-to-many.

    Voici un résumé rapide du xml :

    Contact :
    long id
    string name
    set cascade="persist" groupes

    Groupe
    long id
    string name
    set inverse="true" many-to-many contacts

    L'idée est lorsqu'on ajoute un nouveau contact, on peut sélectionner un groupe parmi ceux qui existent en base de données, et on peut créer en même temps de nouveaux groupes.

    Le code suivant fonctionnais très bien, la sessionFactory, la sesssion et la transaction ont été remplacés par getHibernateTemplate().

    La ligne contact.addGroupe(g) est un ajout bidirectionnel entre Groupe et Contact.

    L'idée est de charger le groupe, si il existe, sinon le créer.
    Dans "groupestoadd", il y a des groupes qui existent en base et ont fait l'objet d'un get() précédemment, saveOrUpdate() doit normalement les rattacher à la session.
    Puis il y a des groupes qui ne sont pas enregistrés, il n'ont donc pas encore un id attribué, saveOrUpdate() doit normalement les enregistrer dans la base


    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
     
    	public void create(final Contact contact, final Set<Groupe> groupestoadd) {
    		getHibernateTemplate().execute(new HibernateCallback() {
    			@Override
    			public Object doInHibernate(Session session) throws HibernateException,
    					SQLException {
    		    	for (Groupe g : groupestoadd) {
    		    		session.saveOrUpdate(g);  //<--------------------
    		    		contact.addGroupe(g);
    				}
    		    	session.persist(contact);
    				return null;
    			}
    		});
    }

    La ligne qui lance une exception est : session().saveOrUpdate(g)


    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
     
    Etat HTTP 500 - Could not execute JDBC batch update; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
     
    type Rapport d''exception
    message Could not execute JDBC batch update; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    description Le serveur a rencontré une erreur interne qui l''a empêché de satisfaire la requête.
    exception 
    org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
            org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:624)
            org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
            org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424)
            org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:339)
            domain.dao.DAOContact.create(DAOContact.java:119)
            util.HibernateUtil.populateDatabase(HibernateUtil.java:111)
            servlets.LoginSevlet.doPost(LoginSevlet.java:25)
            javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
            javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    cause mère 
    org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
            org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
            org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
            org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
            org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114)
            org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109)
            org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244)
            org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2393)
            org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2856)
            org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79)
            org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
            org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265)
            org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184)
            org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
            org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
            org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
            org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:390)
            org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:420)
            org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:339)
            domain.dao.DAOContact.create(DAOContact.java:119)
            util.HibernateUtil.populateDatabase(HibernateUtil.java:111)
            servlets.LoginSevlet.doPost(LoginSevlet.java:25)
            javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
            javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    cause mère 
    java.sql.BatchUpdateException: Duplicate entry 'friend' for key 'name'
            com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2020)
            com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1451)
            org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
            org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
            org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114)
            org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109)
            org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244)
            org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2393)
            org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2856)
            org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79)
            org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
            org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265)
            org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184)
            org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
            org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
            org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
            org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:390)
            org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:420)
            org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:339)
            domain.dao.DAOContact.create(DAOContact.java:119)
            util.HibernateUtil.populateDatabase(HibernateUtil.java:111)
            servlets.LoginSevlet.doPost(LoginSevlet.java:25)
            javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
            javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    note La trace complète de la cause mère de cette erreur est disponible dans les fichiers journaux de Apache Tomcat/7.0.33.
     
    Apache Tomcat/7.0.33

    Alors on remarque «Duplicate entry 'friend' for key 'name'».
    Cela ce produit lors de la seconde insertion.

    Avant de mettre Spring, ce code fonctionnait.

    Maintenant, comment je peux faire pour contourner cette exception?
    Quelle stratégie adopter pour enregistrer de nouveaux Contact possédant des Groupe existant dans la base ?


    Merci

  2. #2
    Membre très actif
    Avatar de Khaled.Noordin
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 354
    Billets dans le blog
    1
    Par défaut
    Salut,
    à vue d’œil, je ne vois pas trop ce qui peut faire bloquer ton code, mais je pense que tout ceci mérite bien une classe de test d’intégration, tu trouvera la classe assez utile AbstractTransactionalJUnit4SpringContextTests pour avoir des tests transactionnels et qui rollback à la fin.
    Je te conseil aussi de jeter un œil là dessus http://springtestdbunit.github.com/spring-test-dbunit/ pour intégrer un jeu de données à tes tests.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Par défaut
    j'allais me lancer dans les testes unitaire, merci pour ce conseil.

    et si vous avez des remarques et conseils liés à la façon de réaliser l'ajout d'un Contact contenant des Groupes qui existe déjà, cela serais le bien venu

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    Bonjour,la question que je me pose plutot c'est comment ça marchait avant.L'erreur vient visiblement de ton sgbd, tu éssaies de rajouter une valeur déjà présente dans une colonne,ceci en voulant violer une contrainte d'unicité sur la colonne, faut peut être regarder de ce côté là non?

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/10/2008, 20h20
  2. Rien ne fonctionne plus depuis que j'ai mis un mot de passe
    Par beegees dans le forum Installation
    Réponses: 8
    Dernier message: 05/03/2008, 14h37
  3. Réponses: 0
    Dernier message: 02/08/2007, 14h20
  4. [MySQL] Ajout de données qui ne fonctionne pas
    Par paterson dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 01/05/2006, 20h28
  5. CSS ne fonctionne plus depuis le passage au XHTML
    Par Cr@zyDeep dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 27/09/2005, 14h42

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