update remove orphanremoval delete con java jpa cascading-deletes

java - remove - ¿Cuál es la diferencia entre la eliminación en cascada y huérfana de DB?



remove jpa java (2)

Desde here : -

Cascading Eliminar

Marcar un campo de referencia con CascadeType.REMOVE (o CascadeType.ALL, que incluye REMOVE) indica que las operaciones de eliminación deben transferirse en cascada automáticamente a los objetos de entidad a los que hace referencia ese campo (múltiples objetos de entidad pueden ser referenciados por un campo de colección):

@Entity class Employee { : @OneToOne(cascade=CascadeType.REMOVE) private Address address; : }

Eliminación huérfana

JPA 2 es compatible con un modo de eliminación de cascadas adicional y más agresivo que se puede especificar mediante el elemento huérfano Removimiento de las anotaciones @OneToOne y @OneToMany:

@Entity class Employee { : @OneToOne(orphanRemoval=true) private Address address; : }

DIFERENCIA:-

La diferencia entre las dos configuraciones está en la respuesta a desconectar una relación. Por ejemplo, como cuando se establece el campo de dirección en nulo o en otro objeto de Dirección.

  • Si se especifica orphanRemoval = true, la instancia de Address desconectada se elimina automáticamente. Esto es útil para limpiar objetos dependientes (por ejemplo, Dirección) que no deberían existir sin una referencia de un objeto propietario (por ejemplo, Empleado).
  • Si solo se especifica cascada = CascadeType.REMOVE, no se realiza ninguna acción automática ya que desconectar una relación no es una eliminación.
    operación.

Cuál es la diferencia entre

@OneToMany(cascade=REMOVE, mappedBy="customer") public List<Order> getOrders() { ... }

y

@OneToMany(mappedBy="customer", orphanRemoval="true") public List<Order> getOrders() { ... }

Este ejemplo es de Java EE Tutorial, pero todavía no entiendo los detalles.


Una manera fácil de entender la diferencia entre CascadeType.REMOVE y orphanRemoval=true .

Para eliminación de huérfanos: si invoca setOrders(null) , las entidades Order relacionadas se eliminarán automáticamente en db.

Para eliminar cascada: si invoca setOrders(null) , las entidades de Order relacionadas NO se eliminarán automáticamente en db.