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

Borrado en hibernate sin cascada

Estas en el tema de Borrado en hibernate sin cascada en el foro de Java en Foros del Web. Hola a todos, estoy haciendo una aplicación principalmente para aprendizaje, se trata de algo bastante simple, usuarios y grupos con una relación n:m de manera ...
  #1 (permalink)  
Antiguo 03/03/2012, 03:25
 
Fecha de Ingreso: marzo-2012
Ubicación: España
Mensajes: 5
Antigüedad: 12 años, 7 meses
Puntos: 0
Borrado en hibernate sin cascada

Hola a todos,

estoy haciendo una aplicación principalmente para aprendizaje, se trata de algo bastante simple, usuarios y grupos con una relación n:m de manera que un usuario puede pertenecer a varios grupos y viceversa, con una tabla usuarios_grupos para mantener las relaciones, lo he hecho en en mysql con hibernate usando mapeos xml y todo funciona correctamente excepto a mi juicio el borrado, cuando borro un usuario se carga también sus registros asociados en usuarios_grupos.

La base de datos está configurada para que de un error al borrar un usuario que pertenece a un grupo, es decir habría que eliminar antes los registros en usuarios_grupos, pero al darle al método delete de hibernate el hace esto automáticamente, podría por código detectar si el usuario tiene grupos y en ese caso no permitir borrar pero ¿hay alguna manera de que salte una excepción e hibernate no haga estos borrados automaticamente?

Os paso el mapeo por si ayuda:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.ap">
<class name="org.ap.Usuario" table="usuarios">

<id name="id" type="java.lang.Long" unsaved-value="0">
<column name="id_usuario" sql-type="bigint" not-null="true"/>
<generator class="identity"/>
</id>

<version name="ver" type="java.lang.Long"/>

<property name="login" type="java.lang.String" />
<property name="password" type="java.lang.String" />
<property name="nombre" type="java.lang.String" />

<bag name="Grupos" table="usuarios_grupos" inverse="false" lazy="true" fetch="select" cascade="none">
<key>
<column name="id_usuario" not-null="true" />
</key>
<many-to-many class="Grupo">
<column name="id_grupo" not-null="true" />
</many-to-many>
</bag>

</class>
</hibernate-mapping>

Gracias
  #2 (permalink)  
Antiguo 03/03/2012, 07:37
 
Fecha de Ingreso: agosto-2011
Ubicación: Madrid
Mensajes: 185
Antigüedad: 13 años, 2 meses
Puntos: 29
Respuesta: Borrado en hibernate sin cascada

Siempre he hecho la configuración usando anotaciones en la propia clase (@Algo), y nunca había tenido problemas con los borrados en cascada. Por ejemplo con:

Código PHP:
@OneToMany(cascade=CascadeType.REMOVE
, realizaba el borrado en cascada. Lo que no estoy seguro es si por defecto en un many to many realiza el borrado en cascada por defecto si no se pone ninguna anotación.
  #3 (permalink)  
Antiguo 05/03/2012, 02:29
 
Fecha de Ingreso: marzo-2012
Ubicación: España
Mensajes: 5
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Borrado en hibernate sin cascada

Cita:
Iniciado por jav_000 Ver Mensaje
Siempre he hecho la configuración usando anotaciones en la propia clase (@Algo), y nunca había tenido problemas con los borrados en cascada. Por ejemplo con:

Código PHP:
@OneToMany(cascade=CascadeType.REMOVE
, realizaba el borrado en cascada. Lo que no estoy seguro es si por defecto en un many to many realiza el borrado en cascada por defecto si no se pone ninguna anotación.
El tema es que no quiero que borre en cascada, ya lo hace y quisiera que me diera una excepción en vez de borrar en cascada.
  #4 (permalink)  
Antiguo 05/03/2012, 03:08
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
Respuesta: Borrado en hibernate sin cascada

Es un poco lioso lo que dices.

Si USUARIOS_GRUPOS es la tabla que relaciona un usuario con un grupo tienes que tener otras dos tablas, USUARIOS y GRUPOS. Si quieres borrar un usuario, habría que eliminar en cascada los registros de USUARIOS_GRUPOS en los que aparezca ese usuario, y luego el registro que haya en USUARIOS, pero ESO no va a borrar ningún grupo al que pertenezca el usuario.

Si quisieses eliminar un grupo tendría más sentido lo que dices. Es decir, tendrías que eliminar los registros de USUARIOS_GRUPOS correspondientes al grupo que quieres eliminar, y si hay usuarios asignados a ese grupo, entonces debería saltar algún aviso que lo impida.

En todo caso, prueba a usar esta anotación:

@OneToMany(cascade = {})

Que viene a ser un cascade = NONE
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #5 (permalink)  
Antiguo 06/03/2012, 06:21
 
Fecha de Ingreso: marzo-2012
Ubicación: España
Mensajes: 5
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Borrado en hibernate sin cascada

Cita:
Iniciado por Fuzzylog Ver Mensaje
Es un poco lioso lo que dices.

Si USUARIOS_GRUPOS es la tabla que relaciona un usuario con un grupo tienes que tener otras dos tablas, USUARIOS y GRUPOS. Si quieres borrar un usuario, habría que eliminar en cascada los registros de USUARIOS_GRUPOS en los que aparezca ese usuario, y luego el registro que haya en USUARIOS, pero ESO no va a borrar ningún grupo al que pertenezca el usuario.

Si quisieses eliminar un grupo tendría más sentido lo que dices. Es decir, tendrías que eliminar los registros de USUARIOS_GRUPOS correspondientes al grupo que quieres eliminar, y si hay usuarios asignados a ese grupo, entonces debería saltar algún aviso que lo impida.

En todo caso, prueba a usar esta anotación:

@OneToMany(cascade = {})

Que viene a ser un cascade = NONE
Si, ya lo he comprobado y desde el punto de vista de programación orientada a objetos es correcto, lo que pasa es que estoy demasiado acostumbrado a bases de datos ... con el cascade=none funciona bien y si no quiero que borre usuarios que estén en grupos tengo que controlarlo por código comprobando que la lista de usuarios sea nula.

Gracias de todos modos

Etiquetas: borrado, cascada, hibernate
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:58.