Diferencia entre @JoinColumn y mappedBy

1. Introducción

Las relaciones JPA pueden ser unidireccionales o bidireccionales. Simplemente significa que podemos modelarlos como un atributo en exactamente una de las entidades asociadas o ambas.

La definición de la dirección de la relación entre entidades no tiene ningún impacto en la asignación de la base de datos. Solo define las direcciones en las que usamos esa relación en nuestro modelo de dominio.

Para una relación bidireccional, generalmente definimos:

  • el lado dueño
  • inverso o el lado de referencia

La anotación @JoinColumn nos ayuda a especificar la columna que usaremos para unirnos a una asociación de entidad o colección de elementos. Por otro lado, el atributo mappedBy se utiliza para definir el lado de referencia (lado no propietario) de la relación.

En este tutorial rápido, veremos la diferencia entre @JoinColumn y mappedBy en JPA. También presentaremos cómo usarlos en una asociación de uno a varios.

2. Configuración inicial

Para seguir este tutorial, digamos que tenemos dos entidades: Empleado y Correo electrónico.

Claramente, un empleado puede tener varias direcciones de correo electrónico. Sin embargo, una dirección de correo electrónico determinada puede pertenecer exactamente a un solo empleado.

Significa que comparten una asociación de uno a varios:

También en nuestro modelo RDBMS, tendremos una clave externa employee_id en nuestra entidad de correo electrónico que se refiere al atributo id de un empleado .

3. @JoinColumn Anotación

En una relación de uno a varios / varios a uno, el lado propietario generalmente se define en el lado " muchos" de la relación. Por lo general, es el lado que posee la clave externa.

La anotación @JoinColumn define ese mapeo físico real en el lado propietario:

@Entity public class Email { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "employee_id") private Employee employee; // ... }

Simplemente significa que nuestra entidad de correo electrónico tendrá una columna de clave externa llamada employee_id que hace referencia al id. De atributo principal de nuestra entidad de empleado .

4. mappedBy Attribute

Una vez que hemos definido el lado propietario de la relación, Hibernate ya tiene toda la información que necesita para mapear esa relación en nuestra base de datos. Para que esta asociación sea bidireccional, todo lo que tendremos que hacer es definir el lado de referencia. El lado inverso o de referencia simplemente se asigna al lado propietario.

Podemos utilizar simplemente las mappedBy atributo de @OneToMany anotación para hacerlo. Entonces, definamos nuestra entidad Empleado :

@Entity public class Employee { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @OneToMany(fetch = FetchType.LAZY, mappedBy = "employee") private List emails; // ... }

Aquí, el valor de mappedBy es el nombre del atributo de mapeo de asociación en el lado propietario. Con esto, ahora hemos establecido una asociación bidireccional entre nuestras entidades Empleado y Correo electrónico .

5. Conclusión

En este tutorial, analizamos la diferencia entre @JoinColumn y mappedBy y cómo usarlos en una relación bidireccional de uno a muchos.

La anotación @JoinColumn define el mapeo físico real en el lado propietario. Por otro lado, el lado de la referencia se define utilizando el atributo mappedBy de la anotación @OneToMany .

Como de costumbre, el código fuente está disponible en Github.