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 :

Problème d"update cascade"


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 19
    Par défaut Problème d"update cascade"
    Bonjour à tous,

    j'ai un soucis avec mon mapping hibernate et je ne sais pas du tout d'où ça vient. J'ai déjà testé plein plein de choses mais je dois être passé à côté ..

    J'ai deux entités FILM et ACTEUR
    J'ai une clé étrangère du FILM dans l'acteur qui me permet de faire le lien.

    Au niveaux de mon mapping, dans mon film.hbm.xml, j'ai un set d'acteurs en cascade=all-delete-orphan.

    Mon soucis est qu'actuellement lorsque j'update un Film en lui supprimant un acteur de sa liste d'acteurs .. ben tout est bien mis à jour SAUF les acteurs, pas d'erreur mais l'acteur est toujours en base avec l'id du film.

    Au niveau des traces hibernate pas d'erreur ni d'instruction DELETE ..
    Normal ?

    Voici mes sources, et en avance, merci beaucoup

    Fichier film.hbm.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <set name="acteurs" inverse="true" cascade="all-delete-orphan">
    	<key column="FILM_ID">
    	</key>
    	<one-to-many class="Acteur"/>
    </set>
    AbstractDomainObject.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	[...]
    public AbstractDomainObject update(AbstractDomainObject object) throws CheckException, DaoException, ObjectNotFoundException {
    try {
    	getHibernateTemplate().saveOrUpdate(object);
    	getHibernateTemplate().flush();
    	return object;
    }
    catch (DataAccessException e)
    {
    	throw new DaoException(e);
    }
    }

  2. #2
    Membre éprouvé Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Par défaut
    Bonjour,

    A moins d'avoir configuré une association bi-directionnelle (avoir un many-to-one dans le mapping de la classe Acteur qui référence une film), il faut enlever ou mettre à false l'attribut inverse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <set name="acteurs" cascade="all-delete-orphan">
    	<key column="FILM_ID">
    	</key>
    	<one-to-many class="Acteur"/>
    </set>

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 19
    Par défaut
    Désolé j'ai oublié de préciser que j'ai effectivement une une association bi-directionnelle pour le mapping d'un ACTEUR:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    <hibernate-mapping package="fr.company.projet.daos" >
    	<class name="Acteur" table="T_ACTEUR" >
     
    		<id name="id" type="long" column="ID" >
    			<generator class="sequence">
    				<param name="sequence">S_ACTEUR</param>
    			</generator>			
        	</id>
    		<property		name="name"			type="string"		column="NAME"/>
    		<many-to-one  name="film" class="Film" column="FILM_ID"  not-null="true"  />
    	</class>
    </hibernate-mapping>
    Mais merci quand même pour le coup d'œil

  4. #4
    Membre éprouvé Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Par défaut
    Une solution consiste à modifier votre mapping pour gérer la relation du côté du Film comme vous le faite actuellement puisque c'est sur l'instance de Film que vous faites le saveOrUpdate.

    Pour cela, il faut :

    Enlever inverse="true" ou mettre inverse="false"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <set name="acteurs" cascade="all-delete-orphan">
    	<key column="FILM_ID">
    	</key>
    	<one-to-many class="Acteur"/>
    </set>
    Ajouter update="false" insert="false" sur le many-to-one
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <many-to-one  name="film" class="Film" column="FILM_ID"  not-null="true" insert="false" update="false" />

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 19
    Par défaut
    Argh du coup j'ai une erreur à l'update :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    org.springframework.dao.DataIntegrityViolationException: could not delete collection: [fr.company.projet.daos.Film.acteurs#160]; nested exception is org.hibernate.exception.ConstraintViolationException: could not delete collection: [fr.company.projet.daos.Film.acteurs#160]
    et du côté des logs :

    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
    89
    90
    91
    92
     
    Hibernate: update T_ACTEUR set FILM_ID=null where FILM_ID=?
    SQL Error: -407, SQLState: 23502
    DB2 SQL Error: SQLCODE=-407, SQLSTATE=23502, SQLERRMC=TBSPACEID=4, TABLEID=524, COLNO=2, DRIVER=3.52.95
    Could not synchronize database state with session
    org.hibernate.exception.ConstraintViolationException: could not delete collection: [fr.company.projet.daos.Film.acteurs#160]
    	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
    	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    	at org.hibernate.persister.collection.AbstractCollectionPersister.remove(AbstractCollectionPersister.java:1071)
    	at org.hibernate.action.CollectionRemoveAction.execute(CollectionRemoveAction.java:88)
    	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
    	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
    	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:169)
    	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
    	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1001)
    	at org.springframework.orm.hibernate3.HibernateTemplate$28.doInHibernate(HibernateTemplate.java:892)
    	at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
    	at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
    	at org.springframework.orm.hibernate3.HibernateTemplate.flush(HibernateTemplate.java:890)
    	at com.geodis.gest.daos.traitement.GestDaoImpl.update(GestDaoImpl.java:336)
    	at fr.company.module.services.traitement.ModuleService.update(GestService.java:136)
    	at fr.company.project.service.traitement.FilmServiceImpl.update(FilmServiceImpl.java:80)
    	at fr.company.project.service.traitement.FilmServiceImpl$$FastClassByCGLIB$$512ac78e.invoke(<generated>)
    	at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
    	at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:700)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
    	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    	at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635)
    	at fr.company.project.service.traitement.FilmServiceImpl$$EnhancerByCGLIB$$23d4757b.update(<generated>)
    	at fr.company.project.service.FilmAMFService.update(FilmAMFService.java:35)
    	at fr.company.project.controller.amf.service.FilmAMFService$$FastClassByCGLIB$$a5142f43.invoke(<generated>)
    	at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
    	at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:700)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
    	at org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.invoke(ThrowsAdviceInterceptor.java:126)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    	at fr.company.project.controller.aop.RightsInterceptor.invoke(RightsInterceptor.java:74)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    	at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635)
    	at fr.company.project.controller.amf.service.FilmAMFService$$EnhancerByCGLIB$$b2ce4a12.update(<generated>)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:597)
    	at flex.messaging.services.remoting.adapters.JavaAdapter.invoke(JavaAdapter.java:421)
    	at flex.messaging.services.RemotingService.serviceMessage(RemotingService.java:183)
    	at flex.messaging.MessageBroker.routeMessageToService(MessageBroker.java:1495)
    	at flex.messaging.endpoints.AbstractEndpoint.serviceMessage(AbstractEndpoint.java:882)
    	at flex.messaging.endpoints.amf.MessageBrokerFilter.invoke(MessageBrokerFilter.java:121)
    	at flex.messaging.endpoints.amf.LegacyFilter.invoke(LegacyFilter.java:158)
    	at flex.messaging.endpoints.amf.SessionFilter.invoke(SessionFilter.java:44)
    	at flex.messaging.endpoints.amf.BatchProcessFilter.invoke(BatchProcessFilter.java:67)
    	at flex.messaging.endpoints.amf.SerializationFilter.invoke(SerializationFilter.java:146)
    	at flex.messaging.endpoints.BaseHTTPEndpoint.service(BaseHTTPEndpoint.java:278)
    	at flex.messaging.MessageBrokerServlet.service(MessageBrokerServlet.java:315)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
    	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    	at java.lang.Thread.run(Thread.java:637)
    Caused by: com.ibm.db2.jcc.a.kn: DB2 SQL Error: SQLCODE=-407, SQLSTATE=23502, SQLERRMC=TBSPACEID=4, TABLEID=524, COLNO=2, DRIVER=3.52.95
    	at com.ibm.db2.jcc.a.ad.a(ad.java:662)
    	at com.ibm.db2.jcc.a.ad.a(ad.java:60)
    	at com.ibm.db2.jcc.a.ad.a(ad.java:127)
    	at com.ibm.db2.jcc.a.rl.b(rl.java:2082)
    	at com.ibm.db2.jcc.a.rl.c(rl.java:2065)
    	at com.ibm.db2.jcc.t4.db.k(db.java:353)
    	at com.ibm.db2.jcc.t4.db.a(db.java:59)
    	at com.ibm.db2.jcc.t4.t.a(t.java:50)
    	at com.ibm.db2.jcc.t4.tb.b(tb.java:200)
    	at com.ibm.db2.jcc.a.sl.Xb(sl.java:2420)
    	at com.ibm.db2.jcc.a.sl.e(sl.java:3262)
    	at com.ibm.db2.jcc.a.sl.Pb(sl.java:605)
    	at com.ibm.db2.jcc.a.sl.executeUpdate(sl.java:588)
    	at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:102)
    	at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23)
    	at org.hibernate.persister.collection.AbstractCollectionPersister.remove(AbstractCollectionPersister.java:1048)
    	... 65 more

  6. #6
    Membre éprouvé Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Par défaut
    Bonjour,

    Avez vous activez le hbm2ddl à update ou create ? Si c'est le cas il peut arriver qu'après plusieurs modifications de mapping successives, hbm2ddl laisse trainer dans la base des contraintes qui n'ont plus lieu d'être.

    Dans ce cas, je détruit complètement la base de données et la recréée en activant hbm2ddl pour laisser à Hibernate le soin de me générer proprement les tables et les contraintes.

    Si après ça, ça ne fonctionne toujours pas ou si votre base de données est construite à la main et que vous êtes sûr de vos contraintes, montrez nous vos 2 fichiers de mapping complets, le code du DAO ainsi que le code qui fait appel au DAO.

Discussions similaires

  1. problème avec ON UPDATE CASCADE
    Par mehdiyou dans le forum SQL
    Réponses: 3
    Dernier message: 12/04/2008, 14h04
  2. Réponses: 1
    Dernier message: 13/09/2007, 16h57
  3. Problème sur Request.ServerVariables("QUERY_STRING"
    Par PrinceMaster77 dans le forum ASP
    Réponses: 3
    Dernier message: 25/03/2005, 11h47

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