Creo que entendí mal el significado de la conexión en 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 la cascade = CascadeType.ALL
? Por ejemplo, si elimino una determinada dirección de la base de datos, ¿cómo afecta el hecho de que agregué la cascade = CascadeType.ALL
información ( User
supongo)?
fuente
Vea aquí un ejemplo de los documentos de OpenJPA.
CascadeType.ALL
significa que hará todas las acciones.Citar:
Sebastian
fuente
Como he explicado en este artículo y en mi libro, de alto rendimiento de persistencia de Java , no se debe utilizar
CascadeType.ALL
en el@ManyToOne
puesto transiciones de estado de la entidad debe propagarse de entidades matrices de los Niños, y no al revés.El
@ManyToOne
lado siempre es la asociación Child, ya que asigna la columna de clave externa subyacente.Por lo tanto, debe mover el
CascadeType.ALL
de la@ManyToOne
asociación al@OneToMany
lado, que también debe utilizar elmappedBy
atributo ya que es la relación de tabla de asignación más eficiente de uno a muchos .fuente
De la especificación EJB3.0 :
En pocas palabras, las relaciones de entidad definidas con
CascadeType.All
garantizarán que todos los eventos de persistencia tales como persistir, actualizar, fusionar y eliminar que ocurran en el padre, se pasen al hijo. La definición de otrasCascadeType
opciones proporciona al desarrollador un nivel de control más granular sobre cómo la asociación de entidades maneja la persistencia.Por ejemplo, si tuviera un libro de objetos que contuviera una lista de páginas y agregue un objeto de página dentro de esta lista. Si la
@OneToMany
anotación que define la asociación entre Libro y Página está marcada comoCascadeType.All
, persistir en el Libro daría como resultado que la Página también se mantenga en la base de datos.fuente
En JPA 2.0, si desea eliminar una dirección si la eliminó de una entidad de usuario, puede agregarla
orphanRemoval=true
(en lugar deCascadeType.REMOVE
) a su@OneToMany
.Más explicación entre
orphanRemoval=true
yCascadeType.REMOVE
está aquí .fuente
Si solo desea eliminar la dirección asignada al usuario y no afectar a la clase de entidad Usuario, debe intentar algo como eso:
De esta manera, no necesita preocuparse por usar fetch en las anotaciones. Pero recuerde que al eliminar el usuario, también eliminará la dirección conectada al objeto de usuario.
fuente