Foros del Web » Programación para mayores de 30 ;) » Java »

DataIntegrityViolationException durante insert en tablas múltiples HIBERNATE

Estas en el tema de DataIntegrityViolationException durante insert en tablas múltiples HIBERNATE en el foro de Java en Foros del Web. 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. ...
  #1 (permalink)  
Antiguo 02/11/2011, 05:03
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
DataIntegrityViolationException durante insert en tablas múltiples HIBERNATE

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?
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #2 (permalink)  
Antiguo 04/11/2011, 06:59
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
Respuesta: DataIntegrityViolationException durante insert en tablas múltiples HIBERNA

He solucionado el primer problema añadiendo la llamada al método flush() de la session después de realizar cada inserción.

Ahora sin embargo, si se produce una excepción en el código y por cualquier motivo no se puede ejecutar el rollback de la transacción (me pasa bastante haciendo debug), al llegar la ejecución de nuevo al método flush() si ya tiene alguna sentencia insert guardada, se queda parada la ejecución en el flush() y no continúa.

No sé de donde viene el problema porque probé a recargar todo (rehacer el war y desplegar, lanzar la aplicación de nuevo, etc) y seguía sin funcionar. Pero de un día para otro funciona.

Lo único que hice de un día para otro fue apagar el pc.
(Todavía) No tengo información sobre si se ha reiniciado la base de datos.

¿Alguien me puede echar una mano?
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}

Etiquetas: durante, hibernate, insert, sql, tablas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:30.