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

hibernate - problema

Estas en el tema de hibernate - problema en el foro de Java en Foros del Web. hola, Estoy dando mis primeros pasos con hibernate y me he topado con un problema que me tiene a mal traer. Les cuento. En mi ...
  #1 (permalink)  
Antiguo 01/05/2006, 14:23
 
Fecha de Ingreso: marzo-2005
Mensajes: 58
Antigüedad: 19 años, 1 mes
Puntos: 0
hibernate - problema

hola,

Estoy dando mis primeros pasos con hibernate y me he topado con un problema que me tiene a mal traer.

Les cuento. En mi modelo tengo las clases User y Office. Un user pertenece a una oficina y una oficina puede tener muchos usuarios. El problema viene por este lado: no me deja borrar una oficina cuando tiene usuarios. Los mensajes de las excepciones no me resultan muy significativos:

WARN - SQL Error: 1205, SQLState: HY000
ERROR - Lock wait timeout exceeded; try restarting transaction
ERROR - Could not synchronize database state with session
org.hibernate.exception.GenericJDBCException: Could not execute JDBC
batch update
...
Caused by: java.sql.BatchUpdateException: Lock wait timeout exceeded; try
restarting transaction


Los archivos de mapeo son los siguientes:

<class name="User"
table="users"
dynamic-insert="true"
dynamic-update="true">

<id name="name" column="email" type="string">
<generator class="assigned"/>
</id>

<many-to-one
name="office"
column="office_id"
class="Office"
not-null="false"/>

</class>

<class name="Office"
table="offices"
lazy="false"
dynamic-insert="true"
dynamic-update="true">

<id name="id" type="long">
<generator class="native"/>
</id>

<property name="type" type="string" not-null="true"/>
<property name="name" type="string" not-null="true"/>

</class>

Si le borro los usuarios borra bien la oficina. Alguien me dice que estoy mapeando mal? Como tengo que hacer las definiciones para que me permita borrar oficinas y simplemente le ponga nulls a los usuarios a referenciaban a ellas?

gracias, saludos, pablo.
  #2 (permalink)  
Antiguo 01/05/2006, 14:38
 
Fecha de Ingreso: marzo-2005
Mensajes: 58
Antigüedad: 19 años, 1 mes
Puntos: 0
Correccion sobre el error

Este es el error:
Caused by: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails

Me esta definiendo la foreign key con una restricted constraint en la base de user a office. Como hago para que no me la genere? Va la duda sigue siendo la misma.
  #3 (permalink)  
Antiguo 02/05/2006, 00:51
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Lo mejor es que tu mismo rompas las relaciones de la oficina antes de borrarla, ya que el Hibernate automaticamente no te lo hace, que yo sepa. La constraint está ahi por integridad referencial para que no haya usuarios relacionados a oficinas inexistentes, asi que yo la dejaría.

Si tienes el mapeo bien definido, no es mas que escribir una instruccion tal que así "oficina.getUsers().clear();" antes de borrar la oficina (comprobando el caso de que getUsers() devuelva null).
  #4 (permalink)  
Antiguo 02/05/2006, 08:38
 
Fecha de Ingreso: marzo-2005
Mensajes: 58
Antigüedad: 19 años, 1 mes
Puntos: 0
pensando

es que yo quiero que por se mantenga la integridad referencial. Pero que pueda haber usuarios sin oficinas asignadas. Que seria el caso cuando se borra una oficina. En un base de datos yo puedo poner una restriccion de integridad referencial que diga que cuando borre una oficina ponga a null los usurios que la referenciaban. No se como especificarle esto a hibernate.
  #5 (permalink)  
Antiguo 02/05/2006, 10:05
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Prueba con las diferentes opciones de "cascade" que tiene el Hibernate. Pero dado que esa no es una característica común a todas las bases de datos, puede que el Hibernate no la implemente.

<S>
  #6 (permalink)  
Antiguo 02/05/2006, 10:33
 
Fecha de Ingreso: marzo-2005
Mensajes: 58
Antigüedad: 19 años, 1 mes
Puntos: 0
Solucionado

Si, estaba probando con eso... pero nada.

Pero le encotre la solucion :) Faltaba que defina la asociacion en la otra direccion. Es decir que en la oficna defina los usuarios. Al definirlo recien ahi desde el punto de vista de la oficina debe saber de la existencia de los usuarios entonces opera antes del delete, con el comportamiento por defecto que (digo yo) debe ser el set null que es lo que esta haciendo (es decir ahora esta haciendo esto hace algo esto antes no hacia nada y saltaba la excepcion que te decia).

Ahora tengo una duda con el tema de administrar bien las sessiones contemplando excepciones. La planteo en otro tema. Te agradeceria tu opinion.

gracias GreenEyed
  #7 (permalink)  
Antiguo 02/05/2006, 11:07
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Jejeje, pues nada, al final era el comportamiento por defecto . Yo como dejo que los documentos de Mapeo me los cree el XDoclet y demás y siempre hago las relaciones bidireccionales, esas cosas no me las he encontrado.

En cuanto a excepciones y sesiones, yo lo que hice fue encapsularmelo todo para no tener que repetir siempre la misma estructura. Y así una vez que tienes la estructura correcta, no tienes que preocuparte de si lo haces bien en cada aplicacion. Pero primero prueba a ver, que así aprenderás como va.

Un saludo
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 19:08.