|    
			
				02/11/2011, 05:03
			
			
			  | 
  |   |  |  |  |  Fecha de Ingreso: agosto-2008 Ubicación: En internet 
						Mensajes: 2.511
					 Antigüedad: 17 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;
 }
     |