onetomany one many example java jpa one-to-many many-to-one

java - onetomany - one to many spring jpa example



JPA @ManyToOne con CascadeType.ALL (5)

Como expliqué en este artículo y en mi libro, persistencia de Java de alto rendimiento , nunca debería usar CascadeType.ALL en @ManyToOne ya que las transiciones de estado de la entidad deberían propagarse desde las entidades principales a las @ManyToOne .

El lado @ManyToOne siempre es la asociación Child, ya que debe mapear el FK subyacente.

Por lo tanto, mueva CascadeType.ALL de la asociación @ManyToOne al @OneToMany que debe usar el atributo mappedBy ya que es el mapeo de uno a muchos más eficiente . `

Creo que extraño entender el significado de la cascada en el contexto de la relación @ManyToOne .

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 a mis datos (el usuario supongo)?


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

En su caso, parece ser una mala idea, ya que eliminar una Address llevaría a eliminar al User relacionado. Como un usuario puede tener múltiples direcciones, las otras direcciones se convertirán en huérfanos. Sin embargo, el caso inverso (anotar al User ) tendría sentido: si una dirección pertenece solo a un usuario, es seguro propagar la eliminación de todas las direcciones que pertenecen a un usuario si este usuario es eliminado.

Por cierto: es posible que desee agregar un mappedBy="addressOwner" a su User para mappedBy="addressOwner" al proveedor de persistencia que la columna de unión debe estar en la tabla ADDRESS.


En JPA 2.0, si desea eliminar una dirección si la eliminó de una entidad de usuario, puede agregar orphanRemoval=true (en lugar de CascadeType.REMOVE ) a su @OneToMany .

Más explicación entre orphanRemoval=true y CascadeType.REMOVE está here .


De la especificación EJB3.0 :

El uso del elemento de anotación en cascada se puede usar para propagar el efecto de una operación a entidades asociadas. La funcionalidad de cascada generalmente se usa en las relaciones entre padres e hijos.

Si X es una entidad gestionada, la operación de eliminación hace que se elimine. La operación de eliminación se aplica en cascada a las entidades referenciadas por X, si las relaciones de X a estas otras entidades se anotan con la cascada = ELIMINAR o en cascada = TODO el valor del elemento de anotación.

En pocas palabras, las relaciones de entidad definidas con CascadeType.All asegurarán que todos los eventos de persistencia como persistir, actualizar, fusionar y eliminar que ocurren en el elemento primario, se transmitirán al elemento secundario. La definición de otras opciones de CascadeType proporciona al desarrollador un nivel de control más detallado sobre cómo la asociación de entidades maneja la persistencia.

Por ejemplo, si tuviera un objeto Libro que contuviera una Lista de páginas y añado un objeto de página dentro de esta lista. Si la anotación @OneToMany define la asociación entre Libro y Página está marcada como CascadeType.All , si persiste en el Libro, la Página también se mantendrá en la base de datos.


Vea aquí un ejemplo de los documentos OpenJPA. CascadeType.ALL significa que hará todas las acciones.

Citar:

CascadeType.PERSIST: cuando persiste una entidad, también persisten las entidades retenidas en este campo. Sugerimos una aplicación liberal de esta regla en cascada, ya que si el EntityManager encuentra un campo que hace referencia a una nueva entidad durante el proceso de descarga, y el campo no usa CascadeType.PERSIST, es un error.

CascadeType.REMOVE: cuando se elimina una entidad, también se eliminan las entidades que se mantienen en este campo.

CascadeType.REFRESH: al actualizar una entidad, también actualice las entidades que se mantienen en este campo.

CascadeType.MERGE: al fusionar el estado de la entidad, también fusiona las entidades que se mantienen en este campo.

Sebastian