Hola
Tengo el siguiente problema. Debo realizar inserciones en dos tablas de forma transaccional. La segunda tabla contiene una FK con respecto a la primera.
En el manager de mi aplicación tengo la siguiente notación:
@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
Y en el método:
1 registro en la tabla 1
N registros en la tabla 2
// Devuelve el obj1 con su identificador (asignado en la bd)
obj1val = dao1.guardar(obj1);
//para cada uno de los n registros (dentro de un bucle)
obj2.setObj1(obj1val ); // Así debería volcar el id correspondiente a la FK
obj2val = dao2.guardar(obj2); // En este caso el id se inserta al primero y se autoincrementa
El problema es que cuando el método finaliza y va a devolver el resultado, hibernate ejecuta las operaciones sobre la BD en ese momento (las debe almacenar de alguna manera cuando se llama al dao), y durante la ejecución se produce una ConstraintViolationException (que se refleja en una DataIntegrityViolationException).
org.springframework.dao.DataIntegrityViolationExce ption: could not insert: [myPackage.MyClass]; nested exception is org.hibernate.exception.ConstraintViolationExcepti on: could not insert: [myPackage.MyClass]
at org.springframework.orm.hibernate3.SessionFactoryU tils.convertHibernateAccessException(SessionFactor yUtils.java:624)
at org.springframework.orm.hibernate3.HibernateTransa ctionManager.convertHibernateAccessException(Hiber nateTransactionManager.java:789)
at org.springframework.orm.hibernate3.HibernateTransa ctionManager.doCommit(HibernateTransactionManager. java:663)
at org.springframework.transaction.support.AbstractPl atformTransactionManager.processCommit(AbstractPla tformTransactionManager.java:709)
at org.springframework.transaction.support.AbstractPl atformTransactionManager.commit(AbstractPlatformTr ansactionManager.java:678)
at org.springframework.transaction.interceptor.Transa ctionAspectSupport.commitTransactionAfterReturning (TransactionAspectSupport.java:321)
at org.springframework.transaction.interceptor.Transa ctionInterceptor.invoke(TransactionInterceptor.jav a:116)
at org.springframework.aop.framework.ReflectiveMethod Invocation.proceed(ReflectiveMethodInvocation.java :171)
at org.springframework.aop.framework.JdkDynamicAopPro xy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy30.miMetodo(Unknown Source)
El error devuelto por la BD (DB2) ES:
Caused by: com.ibm.db2.jcc.a.bo: DB2 SQL Error: SQLCODE=-407, SQLSTATE=23502, SQLERRMC=TBSPACEID=2, TABLEID=919, COLNO=2, DRIVER=4.3.111
Después de depurar, he visto que si le cambio a pelo el identificador del primer objeto antes de incluirlo en los siguientes por uno que ya existiese, los inserts en la siguiente tabla se realizan (referido a los registros antiguos), pero hibernate o la BD no reconocen que se haya realizado el insert previo.
¿Alguna idea?