¿Cuál es el significado de CascadeType.ALL para una asociación JPA @ManyToOne?

Resuelto forhas asked hace 11 años • 6 respuestas

Creo que entendí mal el significado de cascada en el contexto de una @ManyToOnerelación.

El caso:

public class User {

   @OneToMany(fetch = FetchType.EAGER)
   protected Set<Address> userAddresses;

}

public class Address {

   @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
   protected User addressOwner;

}

¿ Cuál es el significado de cascade = CascadeType.ALL? Por ejemplo, si elimino una determinada dirección de la base de datos, ¿cómo afecta a cascade = CascadeType.ALLmis datos el hecho de haberla añadido (el User, supongo)?

forhas avatar Oct 23 '12 16:10 forhas
Aceptado

El significado de CascadeType.ALLes que la persistencia propagará (en cascada) todas EntityManagerlas operaciones ( PERSIST, REMOVE, REFRESH, MERGE, DETACH) a las entidades relacionadas.

En su caso, parece ser una mala idea, ya que eliminar un Addressconduciría a eliminar el archivo relacionado User. Como un usuario puede tener varias direcciones, las otras direcciones quedarían huérfanas. Sin embargo, el caso inverso (anotar el User) tendría sentido: si una dirección pertenece a un solo usuario, es seguro propagar la eliminación de todas las direcciones que pertenecen a un usuario si se elimina este usuario.

Por cierto: es posible que desee agregar un mappedBy="addressOwner"atributo a su Userpara indicarle al proveedor de persistencia que la columna de unión debe estar en la tabla DIRECCIÓN.

kostja avatar Oct 23 '2012 09:10 kostja

No deberías usar CascadeType.ALLon @ManyToOneya que las transiciones de estado de entidad deben propagarse de las entidades principales a las secundarias, y no al revés.

Está @ManyToOneen el lado secundario de la asociación, ya que asigna la columna de clave externa subyacente.

Por lo tanto, debe mover el CascadeType.ALLde la @ManyToOneasociación hacia un @OneToManylado, lo que también debe usar el mappedByatributo, ya que es el mapeo de relaciones de tablas de uno a muchos más eficiente.

Vlad Mihalcea avatar Aug 10 '2017 12:08 Vlad Mihalcea