Ver Mensaje Individual
  #9 (permalink)  
Antiguo 29/07/2008, 08:59
Avatar de Llave
Llave
 
Fecha de Ingreso: abril-2005
Ubicación: Galicia
Mensajes: 52
Antigüedad: 19 años, 7 meses
Puntos: 1
Respuesta: Eliminar con Hibernate

A ver, yo te cuento como lo suelo hacer yo. A ver si te sirve de algo la información que yo te doy.

(Voy a hablar siempre en concepto de Bases de datos, no Hibernate).

Supongamos que tengo una entidad A que tiene relación 1-N con 2 entidades más, B y C.

A-----1-N------B
A-----1-N------C

Las referencias a A desde B y C son not-null.

Si yo deseo Borrar A, automáticamente, B y C es posible que tengan alguna referencia a NULL ya que apuntan a A y esta ha cambiado.

Creo que no se entiende bien. Pondré ejemplos más concretos.
A va a ser Usuarios.
B Empresas.
C Tareas.

Imaginemos que la situación es que Tenemos usuarios que tienen varias empresas y Pueden realizar diversas tareas con motivo de su formación profesional y tenemos registrado todo eso.
De forma que nuestra base de datos tiene 3 entidades USUARIOS, EMPRESAS, TAREAS.
Empresas y tareas tienen referencias a USUARIO, siendo estas Not null.

Código:
CREATE TABLE Usuarios (
id INT NOT NULL,
name VARCHAR(100),
PRIMARY KEY(id)
 );

CREATE TABLE Empresa (
id INT NOT NULL,
pertenece INT NOT NULL REFERENCES Usuarios(id) ON DELETE CASCADE,
PRIMARY KEY(id)
 );

CREATE TABLE Tareas (
id INT NOT NULL,
pertenece  INT NOT NULL REFERENCES Usuarios(id) ON DELETE CASCADE,
PRIMARY KEY(id)
 );
Si te fijas en el ejemplo. Si quiero mantener la consistencia de la base de datos. Debo poner un "On delete cascade" en los atributos que hacen referencia a otra clase. De esta forma, si borro un usuario que tenga empresas y tareas, la base de datos se encargará de buscar esas referencias y eliminar esas entradas de la base de datos también, quedando una base de datos consistente.

Pero... que pasaría si modificásemos la tabla Empresa y le quitásemos el cascade.
Código:
CREATE TABLE Empresa (
id INT NOT NULL,
pertenece INT NOT NULL REFERENCES Usuarios(id),
PRIMARY KEY(id)
 );
En el momento en que eliminemos un usuario, las tareas que tenga asociadas se borrarán automáticamente, no así las Empresas, quedandonos una base de datos inconsistente y erronea. En el momento en que acceda a las entradas de Empresa verá que alguna apunta a un usuario que no existe (NULL) violando la regla de definición de la tabla y rompiendo el sistema.

Espero que te resultase útil este ejemplo y puedas ver si cometiste algún error en tu Base de datos.
En principio... sólo necesitarías declarar los "Cascade" en tu BD. Hibernate ya los reconocería cuando la "mapees".

Suerte.