Relaci贸n muchos a uno con @ManyToOne

Relaci贸n muchos a uno con @ManyToOneUna de las grandes ventajas que tiene trabajar con JPA, es que te permite hacer relaciones con otras entidades, de esta forma, es posible agregar otras Entidades como atributos de clase y JPA se encargar谩 de realizar el SELECT adicional para cargar esas Entidades.

Para comprender esto, analicemos el ejemplo de las facturas, estas siempre son emitidas a un cliente, por lo que el objeto Factura siempre deber谩 tener una propiedad que represente al cliente. Normalmente, esta propiedad seria el ID, sin embargo, JPA nos permite tener una referencia a la Entidad cliente. Veamos c贸mo quedar铆a la Entidad Invoice聽 (factura)

Como podemos apreciar, hemos utiliza la anotaci贸n @ManyToOne聽, la cual nos permite mapear una entidad con otra. Como 煤nica regla, es necesario la clase que sea una entidad, es decir, que tambi茅n est茅 anotada con @Entity聽.

Por otro lado, tenemos la entidad Customer聽, la cual se ve de la siguiente manera:

Estas dos entidades nos crear谩n las siguientes tablas:

JPA ManyToOne tables

La anotaci贸n @ManyToOne cuenta con los siguientes atributos:

  • Optional: indica si la relaci贸n es opcional, es decir, si el objeto puede ser null. Esta propiedad se utiliza optimizar las consultas. Si JPA sabe que una relaci贸n es opcional, entonces puede realizar un RIGHT JOIN聽 o realizar la consulta por separado, mientras que, si no es opcional, puede realizar un INNER JOIN聽 para realizar una solo consulta.
  • Cascade: Esta propiedad le indica que operaciones en cascada puede realizar con la Entidad relacionada, los valores posibles son ALL聽, PERSIST聽, MERGE聽, REMOVE聽, REFRESH聽, DETACH聽y est谩n definidos en la enumeraci贸n javax.persistence.CascadeType聽.
  • Fetch: Esta propiedad se utiliza para determinar c贸mo debe ser cargada la entidad, los valores est谩n definidos en la enumeraci贸n javax.persistence.FetchType聽 y los valores posibles son:
    • EAGER (ansioso): Indica que la relaci贸n debe de ser cargada al momento de cargar la entidad.
    • LAZY (perezoso): Indica que la relaci贸n solo se cargar谩 cuando la propiedad sea le铆da por primera vez.
  • targetEntity: Esta propiedad recibe una clase ( Class聽) la cual corresponde a la clase de la relaci贸n. No suele ser utilizada, pues JPA puede inferir la clase por el tipo de la propiedad.

En nuestro caso, hemos definido la propiedad optional en false, pues toda factura debe de tener forzosamente un Cliente (customer). La propiedad cascade la definimos en ALL聽 para facilitarnos la explicaci贸n de este ejemplo, pero m谩s adelante en este tutorial analizaremos las cascadas en profundidad. La propiedad fetch la definimos en EAGER聽, aun que para este tipo de relaci贸n es su valor por default y no ser铆a necesario definirlo.

Ejemplo pr谩ctico

Crearemos un peque帽o ejemplo que nos permita comprobar c贸mo trabajar con esta relaci贸n, para ello, crearemos una nueva factura con un cliente:

Como resultado, podemos observar como han sido insertados la Factura y el Cliente:

JPA Invoices ManyToOne relationship
Tabla de las facturas

JPA Customers ManyToOne relationship
Tabla de los clientes

Por otra parte, si consultamos la Entidad Invoice, JPA se encargar谩 de cargar al Empleado, vamos el siguiente ejemplo:

Como podemos apreciar en la siguiente imagen, no fue necesario ir a consultar el Cliente por separado, si no que JPA se encarga de recuperarlo justo en el momento en que lo necesitamos.

JPA ManyToOne select

Finalmente, podemos ver en las siguiente im谩genes como es que nos auto genero la tabla de las facturas, en ella podemos apreciar el campo CUSTOMER_ID聽, el cual es en realidad una llave for谩nea a la tabla de clientes:

JPA ManyToOne table

JPA tambi茅n nos ayuda a crear los Foreign Keys con la tabla de Clientes:

JPA ManyToOne foreign keys

Conclusiones

Hemos podido observar como JPA se encarga de todo lo relacionado a persistir o recuperar el cliente de la base de datos, sin embargo, hay algo que no hemos cubierto, y es la forma en que podemos personalizar la columna, es decir, como podemos indicarle el nombre, si admite nulos o no, etc. Todas esta propiedades las podremos definir en la anotaci贸n @JoinColumn聽 que analizaremos en la siguiente parte del tutorial

Anterior脥ndiceSiguiente

Deja un comentario

Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *