¿Cuál es el significado de CascadeType.ALL para una asociación JPA @ManyToOne?
Creo que entendí mal el significado de cascada en el contexto de una @ManyToOne
relació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.ALL
mis datos el hecho de haberla añadido (el User
, supongo)?
El significado de CascadeType.ALL
es que la persistencia propagará (en cascada) todas EntityManager
las operaciones ( PERSIST, REMOVE, REFRESH, MERGE, DETACH
) a las entidades relacionadas.
En su caso, parece ser una mala idea, ya que eliminar un Address
conducirí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 User
para indicarle al proveedor de persistencia que la columna de unión debe estar en la tabla DIRECCIÓN.
No deberías usar CascadeType.ALL
on @ManyToOne
ya que las transiciones de estado de entidad deben propagarse de las entidades principales a las secundarias, y no al revés.
Está @ManyToOne
en el lado secundario de la asociación, ya que asigna la columna de clave externa subyacente.
Por lo tanto, debe mover el CascadeType.ALL
de la @ManyToOne
asociación hacia un @OneToMany
lado, lo que también debe usar el mappedBy
atributo, ya que es el mapeo de relaciones de tablas de uno a muchos más eficiente.