2010-09-17 21 views
19

Estoy usando JPA sobre Hibernate en mi aplicación web. A continuación se muestran (sólo son captadores) dos entidades:jpa eliminación del hijo de la colección

 
class Child { 

    private Parent parent; 

    @ManyToOne(optional=false) 
    @JoinColumn(name="parent_id", referencedColumnName="parent_id", nullable=false, updatable=false) 
    public Parent getParent() { 
    return parent; 
    } 
} 

class Parent { 

    private Collection children; 

    @OneToMany(fetch=FetchType.EAGER, mappedBy="parent", cascade={CascadeType.ALL}) 
    public Collection getChildren() { 
    return children; 
    } 
} 

Como se ve Parent y Child relacionas como "uno-a-muchos".

Ahora necesito cargar una instancia de Parent, eliminar algunos o todos los elementos secundarios y guardar los cambios. A continuación se muestra el código que no funciona para mí: entidades

 
Parent p = entityManager.find(Parent.class, 12345L); // load entity 
p.getChildren().clear(); // remove all children 
entityManager.merge(p); // try to save 

niño no se eliminan en el ejemplo anterior. Ahora tengo que llamar manualmente al entityManager.remove() para cada niño.

¿Hay alguna manera más fácil de administrar la recolección de niños? Tenga en cuenta que no quiero utilizar la funcionalidad específica de Hibernate, solo JPA puro.

Regards, Andrey

+0

posible duplicado de [APP CascadeType.ALL no elimina los huérfanos.] (Http: //stackoverflow.com/questions/306144/jpa-cascadetype-all-does-not-delete-orphans) –

Respuesta

23

Para JPA 2.0 que puede establecer orphanRemoval=true de la @OneToMany

Para JPA 1.0, se deben utilizar las anotaciones de hibernación-específicos. Esa es la @Cascade anotación (en lugar del atributo cascade), con un valor de

@Cascade({CascadeType.ALL, CascadeType.DELETE_ORPHAN}) 

Hibernate 3.5 + implemento JPA 2.0

+0

¿Hay alguna solución para JPA 1.0? No estoy listo para cambiar el implementador de JPA. – Andrey

+0

@Andrey sí, acabo de agregarlo – Bozho

+0

Gracias, esa es una buena manera. establecer orphanRmoval, cuando merge puede eliminar al huérfano – Scarlett

Cuestiones relacionadas