2012-05-08 8 views
5

Tengo una aplicación que carga objetos a través de la hibernación y luego pasa esos objetos a otro nivel como objetos separados. Cualquier cambio en esos objetos se envía de vuelta al nivel de hibernación donde llamo al saveOrUpdate() en esos objetos.Will Hibernate método saveOrUpdate delete children?

¿Hibernaré eliminar objetos secundarios de relación uno a muchos contenidos en una colección en los objetos que pasan a saveOrUpdate() si simplemente elimino el objeto hijo de la colección antes de llamar al saveOrUpdate()?

De lo contrario, ¿cómo podría lograrse esto normalmente en una aplicación de hibernación que utiliza objetos separados?

Respuesta

5

hibernará borrar uno-a-muchos objetos secundarios relacion contenida en una colección de los objetos que se pasan en saveOrUpdate() si basta con quitar el objeto hijo de la colección antes de llamar a saveOrUpdate()?

No, no de forma predeterminada. Dichos objetos secundarios se conocen como "huérfanos" en este contexto, suponiendo que alguna otra entidad tampoco tenga una referencia a ellos.

Esto se discute en los documentos, 11.11. Transitive persistence:

Un estilo en cascada especial, delete-orphan, se aplica sólo a uno a muchas asociaciones, e indica que la operación delete() se debe aplicar a cualquier objeto secundario que se elimina de la asociación. Usando anotaciones no hay CascadeType.DELETE-ORPHAN equivalente. En su lugar, puede utilizar el atributo huérfano Remoción como se ve en el Ejemplo 11.4, "@OneToMany con orphanRemoval". Si una entidad se elimina de una colección @OneToMany o una entidad asociada se desreferencia de una asociación @OneToOne, esta entidad asociada se puede marcar para su eliminación si orphanRemoval se establece en verdadero.

+0

Eso tiene sentido. Sin embargo, cuando configuro CascadeType.ALL, orphanRemoval = true en la colección, el objeto secundario aún no se elimina. ¿Podría deberse al hecho de que estoy usando una anotación de JoinColumn junto con la anotación de OneToMany? – Tom

+0

@Tom: Probablemente no, no, '@ JoinColumn' solo se utiliza para anular el nombre de la columna de combinación predeterminada. Parece que Hibernate no cree que sea huérfano. ¿Estás seguro de que alguna otra entidad no tiene una referencia a ese niño? – skaffman

+0

Definitivamente no se hace referencia desde otra entidad. Sin embargo, la relación de base de datos subyacente es en realidad ManyToMany y estoy usando OneToMany con JoinColumn para simplificar el modelo. Tal vez eso es arrojarlo? De lo contrario, también me di cuenta de que algunas entidades secundarias del niño contienen relaciones ManyToOne que no pueden tener el atributo orphanRemoval establecido en ellas. Tal vez eso impida la eliminación del padre de alguna manera. – Tom

0

Por defecto, no lo hará. Puede usar @Cascade (CascadeType.DELETE_ORPHANS) para lograr eso.

Cuestiones relacionadas