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

  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.

  7. #7
    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
    Rebonjour à tous .. dsl indisponible pendant quelques jours.

    Mais pour te répondre we.are.the.storm : non pas de hbm2ddl donc je vous poste tout ci-dessous. J'ai encore essayer beaucoup de choses mais sans succès. Par contre je me suis rendu compte que cet échec de suppression silencieux se produit avec d'autres entités de ma base qui ont le même mapping quasiment.
    Je rappelle que l'ajout d'un acteur dans le set d'acteurs d'un film fonctionne bien mais uniquement la suppression n'est pas prise en compte ..
    Puis pour d'avantage de détails j'avais oublié de préciser que la connexion se fait vers une BDD DB2, que j'utilise spring 2.5.6 et hibernate 3.2.7.ga

    Acteur.hbm.xml
    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>

    Film.hbm.xml
    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
     
    <hibernate-mapping package="fr.company.projet.daos" >
    <class name="Film" table="T_FILM" >
     
     <id name="id" type="long" column="ID" >
        <generator class="sequence">
            <param name="sequence">S_FILM</param>
        </generator>			
     </id>
     
     <property name="name" type="string" column="NAME"/>
     <set name="acteurs" cascade="all-delete-orphan">
    	<key column="FILM_ID">
    	</key>
    	<one-to-many class="Acteur"/>
     </set>
     
    </class>
    </hibernate-mapping>
    Mon abstract DAO
    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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
     
    public abstract class AbstractDaoImpl extends HibernateDaoSupport implements IAbstractDao {
        public abstract String getDomainObjectName();
        public abstract String getCamelCaseDomainObjectName();
        public abstract Class getDomainObjectClass();
     
        public AbstractDomainObject findById(Long id) throws DaoException, ObjectNotFoundException, CheckException {
            return findById(id, true);
        }
     
        public AbstractDomainObject findById(Long id, boolean checkSoftDelete) throws DaoException, ObjectNotFoundException, CheckException {
            if (id == null) {
                throw new CheckException("l'id est obligatoire");
            }
     
            try {
                AbstractDomainObject object = (AbstractDomainObject) getHibernateTemplate().load(getDomainObjectClass(), id);
                if (object == null) {
                    throw new ObjectNotFoundException();
                }
                return object;
            } catch (Exception e) {
                throw new DaoException("ne peut pas recuperer l'objet. ", e);
            }
        }
     
     
        /**
         * generic count method used to retrieve the total object entities count
         *
         * @return int count
         */
        public int count() throws DaoException, CheckException  {
            LOG.debug("entering "+getDomainObjectName()+"DAO.count()");
            Criteria criteria = getSession().createCriteria(getDomainObjectClass());
            criteria.add(Restrictions.gt("id", 0L));
            criteria.setProjection(Projections.rowCount());
            List result = criteria.list();
            return ((Integer) result.get(0)).intValue();
          }
     
     
        /**
         * generic count method used to retrieve the total object entities count with search criterias
         *
         * @param String[] criterias
         * @param String[] values
         * @return int count
         */
        public int count(String[] criterias, String[] values) throws DaoException, CheckException  {
            LOG.debug("entering "+getDomainObjectName()+"DAO.count()");
            Criteria criteria = getSession().createCriteria(getDomainObjectClass());
            criteria.add(Restrictions.gt("id", 0L));
            criteria.setProjection(Projections.rowCount());
            if(criterias!=null){
                for(int i=0;i<criterias.length;i++)
                {
                    criteria.add(Restrictions.eq(criterias[i],values[i]));
                }
            }
            List result = criteria.list();
            return ((Integer) result.get(0)).intValue();
          }
     
     
        /**
         * generic insert method used to insert a single object entity
         *
         * @param AbstractDomainObject object
         * @return AbstractDomainObject
         */
        public AbstractDomainObject insert(AbstractDomainObject object) throws  DaoException, DuplicateKeyException, CheckException {
            LOG.debug("entering "+getDomainObjectName()+"DAO.insert");
     
            try {
                // set creation values
                object.setId((Long)getHibernateTemplate().save(object));
                getHibernateTemplate().flush();
                return object;
            }
            catch (GenericJDBCException ge) {
                if ((ge.getCause() != null)
                        && (ge.getCause() instanceof SQLException)) {
                    SQLException sqlException = (SQLException) ge.getCause();
                    if (sqlException.getErrorCode() == TpmConstantes.DATA_ALREADY_EXIST) {
                        throw new DuplicateKeyException();
                    } else {
                        throw new DaoException(ge);
                    }
                } else {
                    throw new DaoException(ge);
                }
            } catch (DataAccessException e) {
                throw new DaoException(e);
            }catch (ConstraintViolationException cve) {
                throw new DaoException(cve);
            }
     
        }
     
        public AbstractDomainObject insertAndEvict(AbstractDomainObject value) throws Exception
        {
            AbstractDomainObject object = insert(value);
            getHibernateTemplate().evict(object);
            return object;
        }
     
        /**
         * generic insert method used to delete a single object entity
         *
         * @param AbstractDomainObject object
         * @return AbstractDomainObject
         */
        public long delete(long id) throws  DaoException,ObjectNotFoundException,CheckException {
     
            //LOG.debug("entering "+getDomainObjectName()+"DAO.delete("+id)+")");
     
            try {
     
                AbstractDomainObject entity = (AbstractDomainObject)getSession().load(getDomainObjectClass(), id);
                getSession().delete(entity);
                //getHibernateTemplate().delete(object);
                return entity.getId();
            }
            catch (DataAccessException e)
            {
                throw new DaoException(e);
            }
        }
     
        /**
         * generic update method used to delete a single object entity
         *
         * @param AbstractDomainObject object
         * @return AbstractDomainObject
         */
        public AbstractDomainObject update(AbstractDomainObject object) throws CheckException, DaoException, ObjectNotFoundException {
     
            LOG.debug("entering "+getDomainObjectName()+"DAO.update("+object.getId()+")");
     
            try {
                getHibernateTemplate().saveOrUpdate(object);
                getHibernateTemplate().flush();
                return object;
            }
            catch (DataAccessException e)
            {
                throw new DaoException(e);
            }
     
        }

    Pour ce qui est du reste ce n'est que du link bête et pas méchant.
    En débugant lorsque j'arrive au "getHibernateTemplate().saveOrUpdate(object)" mon objet du domaine est bien formé sans l'élément supprimer dans sa collection d'acteurs. Mais rien à faire que je regarde la base après ou que je fais un find l'acteur supprimé refait son apparition.

    La moindre critique est la bienvenue, je ne sais plus quoi faire. Même une solution de rechange un peu plus crade me conviendra en attendant de trouver mieux.

    Merci beaucoup we.are.the.storm pour tes pistes déjà et à tous les autres qui m'ont lu

  8. #8
    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,

    J'ai repris votre code dans une mini application et voici les adaptations (en gras ) que j'ai apportées pour avoir l'insert et le delete d'acteurs qui fonctionne lorsque l'on effectue un saveOrUpdate(...) sur un film :

    Dans Acteur.hbm.xml, vous avez bien une association bi-directionnelle, il faut donc qu'un des 2 côtés soit décharger de la responsabilité de la mise à jour de la base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <hibernate-mapping package="com.jnesis..." >
        <class name="Acteur" table="T_ACTEUR" >
           <id name="id" type="long" column="ID" >
             <generator class="native" />
           </id>
    
          <property name="name" type="string" column="NAME"/>
          <many-to-one  name="film" class="Film" column="FILM_ID" 
                               not-null="true" insert="false" update="false" />
          
        </class>
    </hibernate-mapping
    Dans Film.hbm.xml, c'est maintenant Film qui a la responsabilité de remplir la clé étrangère dans 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
    15
    16
    <hibernate-mapping package="com.jnesis..." >
    <class name="Film" table="T_FILM" >
    
     <id name="id" type="long" column="ID" >
        <generator class="native" />
     </id>
    
     <property name="name" type="string" column="NAME"/>
     <set name="acteurs" cascade="all-delete-orphan">
    	<key column="FILM_ID" not-null="true">
    	</key>
    	<one-to-many class="Acteur"/>
     </set>
    
    </class>
    </hibernate-mapping>
    Et pour finir, dans Film.java s'assurer que dans votre modèle il y ait toujours une collection initialisée (même vide) :
    private Set<Acteur> acteurs = new HashSet<Acteur>();
    Plus une petite méthode qui s'assure que la double relation est bien respectée également au niveau des références entre instances :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void addActeur(Acteur acteur)
        {
            acteur.setFilm(this);
            this.acteurs.add(acteur);        
        }

Discussions similaires

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

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