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
Pour ce qui est des mapping, voici ce qu'il en est :
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
Table Parent :
table Enfant :
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> [...]
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…
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" /> [...]
Partager