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

Problema Hibernate al borrar un registro

Estas en el tema de Problema Hibernate al borrar un registro en el foro de Java en Foros del Web. hola, soy nuevo en el foro.. espero alguein me peuda ayudar.. tengo un problema q por mas q busco como solucionarlo no encuentro como... tengo ...
  #1 (permalink)  
Antiguo 30/05/2009, 14:17
 
Fecha de Ingreso: mayo-2009
Mensajes: 3
Antigüedad: 15 años
Puntos: 0
Problema Hibernate al borrar un registro

hola, soy nuevo en el foro.. espero alguein me peuda ayudar.. tengo un problema q por mas q busco como solucionarlo no encuentro como...

tengo una BD MySQL y mi aplicacion de java usa hibernate... la BD tiene una tabla que es Area que tiene un ON DELETE RESTRICT para poder conservar correctamente las relaciones. El problema esta que cuando el usuario intenta borrar un registro de esta tabla que tiene alguna relacion, la base de datos no se lo permite pues causa un "SQL Error: 1451, SQLState: 23000" lo que hace que la aplicacion se cierre...

Les dejo el stacktrace del error:

30/05/2009 02:50:40 PM org.hibernate.util.JDBCExceptionReporter logExceptions
ADVERTENCIA: SQL Error: 1451, SQLState: 23000
30/05/2009 02:50:40 PM org.hibernate.util.JDBCExceptionReporter logExceptions
GRAVE: Cannot delete or update a parent row: a foreign key constraint fails (`calakmul/puesto`, CONSTRAINT `area_puesto` FOREIGN KEY (`idarea`) REFERENCES `area` (`idarea`) ON UPDATE CASCADE)
30/05/2009 02:50:40 PM org.hibernate.event.def.AbstractFlushingEventListe ner performExecutions
GRAVE: Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationExcepti on: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert( SQLStateConverter.java:71)
at org.hibernate.exception.JDBCExceptionHelper.conver t(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(Ab stractBatcher.java:253)
at org.hibernate.engine.ActionQueue.executeActions(Ac tionQueue.java:237)
at org.hibernate.engine.ActionQueue.executeActions(Ac tionQueue.java:146)
at org.hibernate.event.def.AbstractFlushingEventListe ner.performExecutions(AbstractFlushingEventListene r.java:298)
at org.hibernate.event.def.DefaultAutoFlushEventListe ner.onAutoFlush(DefaultAutoFlushEventListener.java :41)
at org.hibernate.impl.SessionImpl.autoFlushIfRequired (SessionImpl.java:969)
at org.hibernate.impl.SessionImpl.list(SessionImpl.ja va:1114)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:7 9)
at calakmul.logica.Area.getLista(Area.java:33)
at calakmul.interfaz.AreaPanel$1.db(AreaPanel.java:64 )
at calakmul.interfaz.AreaPanel$1.db(AreaPanel.java:60 )
at com.amarello.ui.interfaz.adapter.SWSingle.doInBack ground(SWSingle.java:75)
at javax.swing.SwingWorker$1.call(SwingWorker.java:27 8)
at java.util.concurrent.FutureTask$Sync.innerRun(Futu reTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.jav a:138)
at javax.swing.SwingWorker.run(SwingWorker.java:317)
at java.util.concurrent.Executors$RunnableAdapter.cal l(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(Futu reTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.jav a:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.run Task(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:637)
Caused by: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`calakmul/puesto`, CONSTRAINT `area_puesto` FOREIGN KEY (`idarea`) REFERENCES `area` (`idarea`) ON UPDATE CASCADE)
at com.mysql.jdbc.PreparedStatement.executeBatchSeria lly(PreparedStatement.java:1666)
at com.mysql.jdbc.PreparedStatement.executeBatch(Prep aredStatement.java:1082)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch( BatchingBatcher.java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(Ab stractBatcher.java:246)
... 21 more
org.hibernate.exception.ConstraintViolationExcepti on: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert( SQLStateConverter.java:71)
at org.hibernate.exception.JDBCExceptionHelper.conver t(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(Ab stractBatcher.java:253)
at org.hibernate.engine.ActionQueue.executeActions(Ac tionQueue.java:237)
at org.hibernate.engine.ActionQueue.executeActions(Ac tionQueue.java:146)
at org.hibernate.event.def.AbstractFlushingEventListe ner.performExecutions(AbstractFlushingEventListene r.java:298)
at org.hibernate.event.def.DefaultAutoFlushEventListe ner.onAutoFlush(DefaultAutoFlushEventListener.java :41)
at org.hibernate.impl.SessionImpl.autoFlushIfRequired (SessionImpl.java:969)
at org.hibernate.impl.SessionImpl.list(SessionImpl.ja va:1114)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:7 9)
at calakmul.logica.Area.getLista(Area.java:33)
at calakmul.interfaz.AreaPanel$1.db(AreaPanel.java:64 )
at calakmul.interfaz.AreaPanel$1.db(AreaPanel.java:60 )
at com.amarello.ui.interfaz.adapter.SWSingle.doInBack ground(SWSingle.java:75)
at javax.swing.SwingWorker$1.call(SwingWorker.java:27 8)
at java.util.concurrent.FutureTask$Sync.innerRun(Futu reTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.jav a:138)
at javax.swing.SwingWorker.run(SwingWorker.java:317)
at java.util.concurrent.Executors$RunnableAdapter.cal l(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(Futu reTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.jav a:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.run Task(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:637)
Caused by: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`calakmul/puesto`, CONSTRAINT `area_puesto` FOREIGN KEY (`idarea`) REFERENCES `area` (`idarea`) ON UPDATE CASCADE)
at com.mysql.jdbc.PreparedStatement.executeBatchSeria lly(PreparedStatement.java:1666)
at com.mysql.jdbc.PreparedStatement.executeBatch(Prep aredStatement.java:1082)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch( BatchingBatcher.java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(Ab stractBatcher.java:246)
... 21 more
Caused by
java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`calakmul/puesto`, CONSTRAINT `area_puesto` FOREIGN KEY (`idarea`) REFERENCES `area` (`idarea`) ON UPDATE CASCADE)
at com.mysql.jdbc.PreparedStatement.executeBatchSeria lly(PreparedStatement.java:1666)
at com.mysql.jdbc.PreparedStatement.executeBatch(Prep aredStatement.java:1082)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch( BatchingBatcher.java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(Ab stractBatcher.java:246)
at org.hibernate.engine.ActionQueue.executeActions(Ac tionQueue.java:237)
at org.hibernate.engine.ActionQueue.executeActions(Ac tionQueue.java:146)
at org.hibernate.event.def.AbstractFlushingEventListe ner.performExecutions(AbstractFlushingEventListene r.java:298)
at org.hibernate.event.def.DefaultAutoFlushEventListe ner.onAutoFlush(DefaultAutoFlushEventListener.java :41)
at org.hibernate.impl.SessionImpl.autoFlushIfRequired (SessionImpl.java:969)
at org.hibernate.impl.SessionImpl.list(SessionImpl.ja va:1114)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:7 9)
at calakmul.logica.Area.getLista(Area.java:33)
at calakmul.interfaz.AreaPanel$1.db(AreaPanel.java:64 )
at calakmul.interfaz.AreaPanel$1.db(AreaPanel.java:60 )
at com.amarello.ui.interfaz.adapter.SWSingle.doInBack ground(SWSingle.java:75)
at javax.swing.SwingWorker$1.call(SwingWorker.java:27 8)
at java.util.concurrent.FutureTask$Sync.innerRun(Futu reTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.jav a:138)
at javax.swing.SwingWorker.run(SwingWorker.java:317)
at java.util.concurrent.Executors$RunnableAdapter.cal l(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(Futu reTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.jav a:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.run Task(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:637)



Ahora les dejo el mapeo de la tabla:

<hibernate-mapping>
<class name="calakmul.logica.Area" table="area">
<id column="idarea" name="id" type="integer" unsaved-value="0">
<generator class="native"/>
</id>
<property column="nombre" name="nombre" not-null="true" type="string"/>
</class>
</hibernate-mapping>


No encuentro la manera de cachar la excepcion que el hibernate lanza....
Se que de alguna manera hibernate debe tener alguna manera de manejar esto.


espero su ayuda... y de antemano gracias!
  #2 (permalink)  
Antiguo 01/06/2009, 02:18
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Problema Hibernate al borrar un registro

Cita:
Iniciado por fsiordia Ver Mensaje
No encuentro la manera de cachar la excepcion que el hibernate lanza....
Como que no?? si ya lo tienes.


Cannot delete or update a parent row: a foreign key constraint fails (`calakmul/puesto`, CONSTRAINT `area_puesto` FOREIGN KEY (`idarea`) REFERENCES `area` (`idarea`) ON UPDATE CASCADE)

Saludos.
  #3 (permalink)  
Antiguo 01/06/2009, 13:57
 
Fecha de Ingreso: mayo-2009
Mensajes: 3
Antigüedad: 15 años
Puntos: 0
Respuesta: Problema Hibernate al borrar un registro

Si, mira... ese es el error que me regresa la BD al intentar borrar esa fila de la tabla. Me manda ese error pues no se puede borrar un registro que tiene una relacion.

En mi programa cada vez que trato de borrar una fila de la tabla Area, se creashea pues se lanza esta exepción. Esto no deberia de pasar, pues si el usuario trata de borrar un registro que esta relacionado, el programa deberia de cachar alguna escepcion y mostrarle un mensaje al usuario diciendo q la accion no es permitida.

Antes de usar hibernate, con un simple try/catch cachaba la excepción (una SQLException) y checaba que si el sqlstate era 23000 entonces le avisaba al usuario que no podía borrar ese registro pues ya estaba relacionado.. quedaba algo así:

catch (SQLException e) {
if (e.getSQLState().equals("23000")) {
//avisar del error
} else {
throw e;
}
}

El problema que he tenido(como soy nuevo en hibernate) es que no encuentro como cachar esa excepción y verificar que la SQLException tiene un sqlstate 23000 para así mandar el mensaje de error al usuario, he intentado con muchas cosas pero no le veo pies ni cabeza.. aquí esta el método de mi clase Area donde hago el delete..

protected void deleteThis(){

HibernateUtil.getInstance().startTransaccion();
HibernateUtil.getInstance().getSession().delete(th is);

}

he intentado cachar la excepción con un HibernateException y un .getCause() pero simplemente no me funciona.. no se que pueda estar haciendo mal.. gracias de antemano.. saludos
  #4 (permalink)  
Antiguo 02/06/2009, 04:00
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Problema Hibernate al borrar un registro

Ahhhh. Vale.

https://www.hibernate.org/hib_docs/v...ionHelper.html

De todos modos, creo que partes de una premisa equivocada.
Ese error no tendria que aparecer. No tendrias que intentar borrar el area si existen registros relacionados. Tendrias que comprobarlo antes de ejecutar la sentencia, o bien hacer un ondelete cascade.

Pero cada caso es particular.

Saludos.
  #5 (permalink)  
Antiguo 17/06/2009, 11:58
 
Fecha de Ingreso: mayo-2009
Mensajes: 3
Antigüedad: 15 años
Puntos: 0
Respuesta: Problema Hibernate al borrar un registro

Oye, pues muchas gracias.. despues de analizarlo e investigar mucho llegue a la misma conclución que tu me diste.

Antes de hacer el Delete revisaré primero si hay relaciones con el registro.

De hecho descubrí que hay una petición de hacer algo para que se maneje este error para próximas versiones de Hibernate.

Saludos!
  #6 (permalink)  
Antiguo 18/06/2009, 01:47
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 3 meses
Puntos: 10
Respuesta: Problema Hibernate al borrar un registro

De nada. Para eso estamos.

De todos modos que haya una peticion en hibernate a que se haga...

Saludos.
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 00:20.