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
Partager