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 :

Suppression en cascade avec Hibernate


Sujet :

Hibernate Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Suppression en cascade avec Hibernate
    Bonjour,

    Je fais ce post en désespoir de cause, voici le problème : J'ai une première table "Parent" toute simple dont une colonne est la clef étrangère d'une autre table "Enfant". Dans la base (Oracle 10), la clé étrangère est déclarée et active.

    Au niveau du mapping Hibernate, le but est donc de supprimer les enregistrements de la table "Enfant" lorsqu'est réalisée la suppression d'un enregistrement de la table "Parent", en gros la suppression préalable des futurs orphelins.

    En fouillant le net, j'ai pu constater qu'il s'agissant d'une problématique courante et, à priori, facilement solvable. Mais que Nenni ! A chaque fois que je supprime l'objet "Parent", j'ai droit à une exception
    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
    3187 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 2292, SQLState: 23000
    3187 [main] ERROR org.hibernate.util.JDBCExceptionReporter - ORA-02292: violation de contrainte (TOM2_TEST1.FK_DELEGATION_DEMANDE) d'intégrité - enregistrement fils existant
     
    3203 [main] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
    org.hibernate.exception.ConstraintViolationException: could not delete: [fr.gipcps.smtom.data.model.DemandeModifTitulaireVO#123]
    	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)
    	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    	at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2569)
    	at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2725)
    	at org.hibernate.action.EntityDeleteAction.execute(EntityDeleteAction.java:97)
    	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:172)
    	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
    	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
    	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
    	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)
    	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
    	at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:655)
    	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:732)
    	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:701)
    	at org.springframework.test.AbstractTransactionalSpringContextTests.endTransaction(AbstractTransactionalSpringContextTests.java:355)
    	at fr.gipcps.smtom.data.dao.impl.TraiterSuppressionDemandeModifTitulaireTest.testSupprimerDemandeModifTitulaire(TraiterSuppressionDemandeModifTitulaireTest.java:80)
    	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 junit.framework.TestCase.runTest(TestCase.java:168)
    	at junit.framework.TestCase.runBare(TestCase.java:134)
    	at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:76)
    	at junit.framework.TestResult$1.protect(TestResult.java:110)
    	at junit.framework.TestResult.runProtected(TestResult.java:128)
    	at junit.framework.TestResult.run(TestResult.java:113)
    	at junit.framework.TestCase.run(TestCase.java:124)
    	at junit.framework.TestSuite.runTest(TestSuite.java:232)
    	at junit.framework.TestSuite.run(TestSuite.java:227)
    	at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
    	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
    	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
    Caused by: java.sql.SQLIntegrityConstraintViolationException: ORA-02292: violation de contrainte (TOM2_TEST1.FK_DELEGATION_DEMANDE) d'intégrité - enregistrement fils existant
     
    	at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:85)
    	at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
    	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:206)
    	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:455)
    	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:413)
    	at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:1034)
    	at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:194)
    	at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:953)
    	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1222)
    	at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3387)
    	at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3468)
    	at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1350)
    	at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:46)
    	at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2548)
    	... 35 more
    Pour ce qui est des mapping, voici ce qu'il en est :

    Table Parent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [...]
    <set name="listeModifsUnitairesDelegations" inverse="true" 
        table="MODIF_UNITAIRE_DELEGATION" cascade="all,delete-orphan">
        <key on-delete="cascade">
            <column name="NUMERO_DEMANDE" precision="10" scale="0" not-null="true" />
        </key>
        <one-to-many class="ModifUnitaireDelegationVO" />
    </set>
    [...]
    table Enfant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [...]
    <many-to-one name="demande" column="NUMERO_DEMANDE" foreign-key="FK_DELEGATION_DEMANDE"
        unique-key="UK_MODIF_DELEGATION" not-null="true" cascade="delete" 
        class="DemandeModifTitulaireVO" />
    [...]
    Au delà d'un éventuel problème de mapping, est-il possible que la configuration de Hibernate ou de Spring pose problème (mal configuré) ? j'ai beau avoir parcouru tout le net tel un cowboy solitaire, j'ai trouvé plein de réponses, mais malheureusement aucune ne fonctionnant…

  2. #2
    Membre régulier Avatar de VirageGroup
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 81
    Points : 95
    Points
    95
    Par défaut
    Bonjour,

    A tout hasard, ne serait-ce pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <set name="listeModifsUnitairesDelegations" cascade="all-delete-orphan"...
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <set name="listeModifsUnitairesDelegations" cascade="all,delete-orphan"...
    VG
    Project Monitor : Solution de pilotage de projets

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bien… je vais me répondre à moi-même

    Il semblerait que le soucis vienne du fait que, au niveau java, l'objet que je considère comme l'enfant contienne la référence vers le parent. Bon, en soit ce n'est pas un soucis, mais dans le mapping j'ai ajouté la propriété suivante dans la déclaration de la collection d'enfant dans le parent Ce qui voulait donc dire que l'enfant était le "propriétaire" de la relation.
    Il fallait donc que je supprime l'enfant en premier, ce qui n'était pas le but.

    La solution à ce problème est donc :
    mais également une modification dans la déclaration de la relation côté enfant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <many-to-one name="demande" column="NUMERO_DEMANDE" not-null="true" 
    unique-key="UK_MODIF_DELEGATION" cascade="delete" insert="false" update="false">
    Dans mon cas, il s'agit d'une contrainte pas très contraignante, mais il n'est pas sur que ça puisse toujours être le cas…

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

Discussions similaires

  1. [Débutant] Suppression en cascade avec EF 5
    Par karamovic dans le forum Entity Framework
    Réponses: 3
    Dernier message: 18/04/2014, 17h41
  2. [MySQL-5.5] Suppression en cascade avec deux parents
    Par Maeho dans le forum Requêtes
    Réponses: 1
    Dernier message: 25/06/2013, 12h20
  3. Problème de cascade avec Hibernate
    Par bouvetj dans le forum Hibernate
    Réponses: 6
    Dernier message: 14/12/2009, 13h01
  4. suppression en cascade avec dataset
    Par inforedaster dans le forum VB.NET
    Réponses: 6
    Dernier message: 14/11/2008, 12h03
  5. Réponses: 4
    Dernier message: 18/06/2007, 08h30

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