2010-11-18 17 views
9

Tengo dos clases, por ejemplo Grupo y Persona con una relación ManyToMany que está mapeada en una JoinTable.JPA/Hibernar: relación Eliminar ManyToMany

Si elimino una Persona que tiene una relación con un Grupo, quiero eliminar la entrada de la tabla de unión (¡no eliminar el grupo mismo!).

¿Cómo debo definir las anotaciones en cascada? No me encontré con una documentación muy útil, pero varias discusiones de mesa sin resolver ...

public class Group { 
    @ManyToMany(
     cascade = { javax.persistence.CascadeType.? }, 
     fetch = FetchType.EAGER) 
    @Cascade({CascadeType.?}) 
    @JoinTable(name = "PERSON_GROUP", 
     joinColumns = { @JoinColumn(name = "GROUP_ID") }, 
     inverseJoinColumns = { @JoinColumn(name = "PERSON_ID") }) 
    private List<Person> persons;  
} 

public class Person { 
    @ManyToMany(
     cascade = { javax.persistence.CascadeType.? }, 
     fetch = FetchType.EAGER, 
     mappedBy = "persons", 
     targetEntity = Group.class) 
    @Cascade({CascadeType.?}) 
    private List<Group> group; 
} 

Respuesta

0

Creo que lo que quiere es:

cascade = CascadeType.ALL 

Para eliminar la relación DB, quitar la asociación de cada grupo . Elimine a la persona de la colección Group.persons y elimine el grupo de la colección Person.group, luego persista su objeto person.

+0

Quiero eliminar la asociación automáticamente al eliminar un objeto de persona. Mi intención es no tener que hacer esto manualmente. Si tengo que hacerlo, no necesito conectar en cascada. ¿O me salió mal la función de conexión en cascada? – tautologe

+0

Tienes que hacerlo. La conexión en cascada no hace esto. –

3

Cascade no va a limpiar los restos de referencias a la Person eliminado que permanecen en el objeto Group en la memoria. Tienes que hacer eso manualmente. Parece que la cascada debería hacer esto, pero lamentablemente esa no es la forma en que funciona.

Basado en la información proporcionada en su pregunta, no creo que necesite ninguna opción de cascada en sus entidades Person o Group. No parece que compartan una relación padre/hijo donde la existencia de uno depende del otro. Ese es el tipo de relación en la que esperaría ver algunas opciones en cascada.

+0

hmm ok, gracias. por cierto. ¿Existe en algún lugar una documentación utilizable de la cascada y cómo combinar las anotaciones jpa e hibernate de una manera sensata? – tautologe

+0

Utilizo Hibernate como proveedor pero solo interactúo con él a través de las interfaces JPA. No soy la persona adecuada para responder preguntas sobre anotaciones específicas de Hibernate. Lo siento. –

0

Probablemente pueda hacerlo específicamente en una base de datos (depende de su base de datos y sus capacidades). Al agregar "en eliminar cascada" a la clave externa de la tabla de relaciones.

Cuestiones relacionadas