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.