Tipos de relaciones en Java Persistence API

  • Por:

  • 11 Marzo 2022
 Java Persistence API

En Java Persistencia API (JPA) hay diferentes tipos de relaciones entre las entidades que explicamos a continuación:

-Uno a Uno: En este nexo, cada entidad está asociada directamente con un único sujeto.

-Uno a Muchos: cada entidad tiene la posibilidad de estar vinculada con muchas. Generalmente, esta unión se determina con un objeto de tipo List, Set, Map, SortedSet o SortedMap.

-Muchos a Uno: es la relación contraria a Uno a Muchos. Normalmente se define con el uso de un mapeo bidireccional.

-Muchos a Muchos: En él, varias entidades está relacionadas a su vez con otras tantas. Cada entidad tiene un objeto de tipo List o Set que hace referencia a la otra entidad. Esto conduce a una tabla de unión en la que se definen las relaciones.
Un ejemplo es la relación entre productos y categorías: un producto puede pertenecer a varias categorías y a su vez en cada categoría puede haber varios productos.

Relaciones según el tipo de direccionalidad

Centrándonos en la direccionalidad, la vinculación entre dos entes puede ser de dos tipos:

-Unidireccional: el mapeo se lleva a cabo únicamente en una dirección. Uno de los extremos de la correlación no sabrá nada sobre el otro extremo.

-Bidireccional: sendos extremos de la relación se conocen. Esta es la opción recomendada por Hibernate, ya que permite navegar por el gráfico de objetos en las dos direcciones.

Extremo propietario

El extremo propietario de la relación será el que sostenga la clave ajena (foreign key) de la base de datos.

+En "Uno a Uno" es el extremo donde se establece la foreign key
+En "Uno a Muchos" o "Muchos a Uno" es desde la posición del "Muchos".

Se utiliza el atributo "mappedBy" para definir el campo que tiene la referencia en la relación.

Tipo de captura o búsqueda

Existen distintos tipos de captura o búsqueda según cómo se ejecuta la búsqueda de los datos en la relación:

  -Lazy: el dato no se pide hasta que se especifica. Es decir, si se tiene una lista, Hibernate va a esperar a que se haga una consulta sobre ella para conseguir los datos de la base de datos.
  -Eager: los datos se consultan por adelantado.

JPA 2.1 usa por defecto:

  • Para "Uno a Varios": Lazy
  • Para "Muchos a Uno": Eager
  • Para "Muchos a Muchos": Lazy
  • Para "Uno a Uno": Eager

Modelo de control de cascada

El tipo de control de cascada explica cómo los cambios de estado se extienden de los objetos padres a los objetos hijos. En JPA existen:

  • Persist: las operaciones de guardado en las entidades padre se difundirán a los seres relacionados.
  • Merge: las entidades relacionadas se unirán cuando la entidad propietaria se vincule.
  • Refresh: actualiza las entidades enlazadas cuando la entidad propietaria se actualiza.
  • Remove: elimina las entidades relacionadas cuando la entidad propietaria se excluye.
  • Detach: separa todas las entidades relacionadas cuando tiene lugar una operación de separación manual.
  • All: se fijan todos los tipos.

Por defecto, no se aplica ninguna operación de cascada.

Gestión de las tablas

Hay 4 formas en las que Hibernate puede tramitar las tablas, en función de la relación entre las entidades:

  • MappedSuperclass: las entidades heredan de una superclase. En este caso, no se crea una tabla de base de datos para la superclase.
  • Tabla única: es el método de trabajo de Hibernate por defecto. Se usa una tabla para todas las subclases
  • Tabla unida: La clase base y las subclases tienen sus propias tablas. Para obtener datos de una subclase, se requiere un join con la tabla padre.
  • Tabla por clase: Cada clase tiene su propia tabla.