Ejemplo de anotación de mapeo uno a uno de Hibernate

Si estamos trabajando en cualquier aplicación de hibernate o estamos planeando trabajar en cualquier en el futuro, entonces usted puede entender fácilmente las relaciones uno a uno entre varias entidades en la aplicación. En este ejemplo de mapeo uno a uno de hibernate, discutiremos 4 variaciones diferentes.

Table of ContentsVarious supported techniques for one to one mapping1. Using foreign key association2. Using join table3. Using shared primary key4. @MapsId

Para este ejemplo de mapeo uno a uno de hibernate, estoy extendiendo el ejemplo escrito para el ejemplo de hibernate hello world. Aquí tenemos dos entidades: Employee y Account.

Un Empleado sólo puede tener una Cuenta. Del mismo modo, una cuenta se asociará con un solo empleado. Es una relación uno a uno para este ejemplo.

Varias técnicas soportadas

En hibernate hay 3 formas de crear relaciones uno a uno entre dos entidades. De cualquiera de las dos formas tenemos que utilizar la anotación @OneToOne.

  1. La primera técnica es la más utilizada y utiliza una columna de clave foránea en una de las tablas.
  2. La segunda técnica utiliza una solución bastante conocida de tener una tercera tabla para almacenar el mapeo entre las dos primeras tablas.
  3. La tercera técnica es algo nuevo que utiliza un valor de clave primaria común en ambas tablas.

Mapeo uno a uno de Hibernate con asociación de clave foránea

En este tipo de asociación, se crea una columna de clave foránea en la entidad propietaria. Por ejemplo, si hacemos propietaria a la EntidadEmpleado, entonces se creará una columna extra "ACCOUNT_ID" en la tabla Employee. Esta columna almacenará la clave foránea para la tabla Account.

La estructura de la tabla será así:

Para hacer tal asociación, consulte la entidad Account en la clase EmployeeEntity como sigue:

@OneToOne@JoinColumn(name="ACCOUNT_ID")private AccountEntity account;

La columna de unión se declara con la anotación @JoinColumn que se parece a la anotación @Column. Tiene un parámetro más llamado referencedColumnName. Este parámetro declara la columna en la entidad de destino que se utilizará para la unión.

Si no se declara @JoinColumn en el lado del propietario, se aplican los valores predeterminados. Se creará una(s) columna(s) de unión en la tabla propietaria y su nombre será la concatenación del nombre de la relación en el lado propietario, _ (guión bajo), y el nombre de la(s) columna(s) de clave primaria en el lado propietario.

En una relación bidireccional, uno de los lados (y sólo uno) tiene que ser el propietario. El propietario es responsable de la actualización de la(s) columna(s) de la asociación. Para declarar un lado como no responsable de la relación, se utiliza el atributo mappedBy. ‘mappedBy’ se refiere al nombre de la propiedad de la asociación en el lado del propietario.

@OneToOne(mappedBy="account")private EmployeeEntity employee;

El atributo «above "mappedBy» declara que depende de la entidad propietaria para el mapeo.

Probemos los mapeos anteriores en la ejecución del código:

La ejecución del código anterior crea el esquema deseado en la base de datos y ejecuta estas consultas SQL.

Puede verificar los datos y los mapeos en ambas tablas cuando ejecute el programa anterior.

Mapeo uno a uno de Hibernate con tabla de unión común

Este enfoque no es nuevo para todos nosotros. Comencemos con la estructura de la base de datos objetivo en esta técnica.

En esta técnica, la principal anotación a utilizar es @JoinTable. Esta anotación se utiliza para definir el nuevo nombre de la tabla (obligatorio) y las claves externas de ambas tablas. Veamos cómo se utiliza:

La anotación @JoinTable se utiliza en la clase EmployeeEntity. Declara que se creará una nueva tabla EMPLOYEE_ACCOUNT con dos columnas EMPLOYEE_ID (clave primaria de la tabla EMPLOYEE) y ACCOUNT_ID (clave primaria de la tabla ACCOUNT).

La prueba de las entidades anteriores genera las siguientes consultas SQL en los archivos de registro:

Mapeo uno a uno de Hibernate con clave primaria compartida

En esta técnica, Hibernate se asegurará de utilizar un valor de clave primaria común en ambas tablas. De esta manera la clave primaria de EmployeeEntity puede ser asumida con seguridad como la clave primaria de AccountEntity también.

La estructura de la tabla será así:

En este enfoque, @PrimaryKeyJoinColumn es la principal anotación a utilizar. Veamos cómo utilizarla.

@OneToOne(cascade = CascadeType.ALL)@PrimaryKeyJoinColumnprivate AccountEntity account;

En el lado de AccountEntity, seguirá dependiendo de la entidad propietaria para el mapeo.

@OneToOne(mappedBy="account", cascade=CascadeType.ALL)private EmployeeEntity employee;

Probar las entidades anteriores genera las siguientes consultas SQL en los archivos de registro:

Mapeo uno a uno de Hibernate con @MapsId

En esta técnica, hibernate asume que tanto el origen como el destino comparten los mismos valores de clave primaria.

En este enfoque, @MapsId es la anotación principal a utilizar. Veamos cómo utilizarla.

@Idprivate Integer employeeId;@OneToOne @MapsIdprivate AccountEntity account;

En el lado de AccountEntity, seguirá dependiendo de la entidad propietaria para el mapeo.

@Idprivate Integer accountId;

Probar las entidades anteriores genera las siguientes consultas SQL en los archivos de registro:

Deja una respuesta

Tu dirección de correo electrónico no será publicada.