Está en la página 1de 21

Relaciones JPA

One to Many
Bidireccional
Uno a Muchos
Para crear una relación
de uno a muchos,
debemos establecer cuál
de las dos tablas va a ser
la primaria y cuál la Tabla secundaria
Tabla Primaria
secundaria (la que
En este caso es así, porque un usuario puede tener
contendrá la llave
muchos posts, pero un post, sólo puede pertenecer
foránea) a un usuario.
Hay que analizar el flujo que tendrán nuestras
tablas para decidir cuál tabla contendrá la llave
foránea.
Tabla usuario
Se utiliza la anotación @OneToMany para definir desde
dónde partirá la relación. Se debe crear un atributo de tipo
Importación genérica para la anotación List, (puede ser ArrayList).

Esta columna tiene la finalidad de guardar las referencias a


La anotación debe contener el nombre del la tabla secundaria.
atributo hacia el que apunta, que pertenece a
la tabla secundaria “mappedBy = “user”” En este caso particular, (por que se puede cambiar el órden
dependiendo del uso que se le dará) ésta columna guardará
los posts que pertenezcan a cada usuario.

Se deben generar los get y set para el


atributo que se agregó
Tabla post
Importaciónes
Se utiliza la anotación @ManyToOne para
completar la relación con la tabla primaria.

@JoinColumn permite agregar


configuraciones extra para la relación, en
La propiedad que se va a utilizar como parte de este caso, se establece que la columna no
la relación, en este caso debe ser del tipo de puede ser nula. La propiedad name,
objeto de la tabla primaria. permite dar nombre a la columna que
estará relacionada en ésta tabla.

@JsonProperty permite que se puedan


guardar los datos en el orden correcto.

El nombre de la propiedad
Se deben generar los get y set para el puede ser cualquiera, es el
atributo que se agregó mismo que se está
mencionando en la tabla
primaria
Como recordarán, cuando existe una relación
entre dos tablas, se debe guardar primero los
valores de la tabla primaria, en este caso, se
guarda primero un usuario usando el método
post.

Resultado de los datos que se guardan.

El resultado de los datos guardados, es un


objeto con los valores ingresados. Pero como
pueden ver, se genera una llave extra, el valor
posts que en este caso no tiene valor.
Posteriormente se guarda un post, con los
nombres de las columnas, tal como están escritos
en la clase entidad.

Y en la llave user, (que es la que va a guardar la


relación) se indica el id del usuario al que
pertenece este post.

En este caso el resultado de


los datos guardados, sólo
muestra el id autogenerado,
el título y el contenido.
Después de guardar usuario y post, podemos hacer
una petición get para ver los usuarios guardados, y
podremos ver que cada usuario, dentro de la llave
posts, contendrá una lista con la información
completa de cada post que le pertenezcan.

Cada que agreguemos un post nuevo, éste se


guardará en su tabla, y al recuperar la información de
usuarios, se mostrará junto con la información
completa de los posts que le pertenezcan.
Si invertimos movemos la anotación @JsonProperty a la tabla usuarios, el orden en el que se mostrarán los
datos al utilizar las peticiones Get va a cambiar.

En este caso, al realizar la petición para mostrar los usuarios, se mostrará solo la información del usuario,
sin los posts que le pertenecen. Y al mostrar los posts, se muestran los posts, con el usuario al que
pertenece este post.

Podemos ver que


la anotación
@JsonProperty
afecta el órden en
que se muestran
los valores.
One to One
Bidireccional
Uno a uno
Una relación uno a uno, será representada en
workbench como si fuera many to one, pero
esencialmente no permite que un usuario
tenga más de una dirección y que una dirección
pertenezca a más de un usuario. Tabla primaria Tabla secundaria
Es decir, básicamente sólo limita que se puedan
insertar datos duplicados, pero se comportará
como una relación ManyToOne
Al igual que Many to one, este tipo de
relación, contempla una tabla primaria y una
secundaria
Tabla usuario
Tabla primaria Se utiliza la anotación @OneToOne para definir desde
dónde partirá la relación.En este caso ambos atributos
Importaciónes relacionados, serán sólamente atributos de clase, es decir,
no serán listas.

La anotación debe contener el nombre del Esta columna tiene la finalidad de guardar las referencias a
atributo hacia el que apunta, que pertenece a la tabla secundaria.
la tabla secundaria “mappedBy = “usuario_id””

Se deben generar los get y set para el


atributo que se agregó
Tabla Direccion
Importaciónes Tabla secundaria
Se utiliza la anotación @OneToOnepara
completar la relación con la tabla primaria.

@JoinColumn permite agregar


configuraciones extra para la relación, en
La propiedad que se va a utilizar como parte de este caso, se establece que la columna no
la relación, en este caso debe ser del tipo de puede ser nula. La propiedad name,
objeto de la tabla primaria. permite dar nombre a la columna que
estará relacionada en ésta tabla.

@JsonProperty permite que se puedan


guardar los datos en el orden correcto.

Se deben generar los get y set para el


atributo que se agregó
Como recordarán, cuando existe una relación
entre dos tablas, se debe guardar primero los
valores de la tabla primaria, en este caso, se
guarda primero un usuario usando el método
post.

Resultado de los datos que se guardan.

El resultado de los datos guardados, es un


objeto con los valores ingresados.
Se agrega una dirección y se especifica el id
del usuario al que pertenece esta dirección

El resultado en postman regresa solo los


datos de la dirección
Esta anotación, sólo deja guardar un objeto para cada relación, es decir, sólo se
puede agregar una dirección para cada usuario.

Si se agrega una dirección adicional para un usuario que ya tenga una asociada, el
api generará un error, que no dejará que funcione ninguna petición, hasta que se
elimine la dirección duplicada.

*Nota: En este tipo de relación, también


funciona mover la anotación @JsonProperties
para cambiar el resultado mostrado (pág 10)
Eliminar - Cascade
Normalmente, si no se define la propiedad Cascade, no se puede eliminar un campo de la
tabla primaria, si ésta contiene valores asociados.

Por ejemplo, si un usuario tiene posts asociados, se tendrían que borrar primero los posts
relacionados y entonces, es cuando se puede borrar al usuario.

Pero si se define la propiedad Cascade en Remove ésta propiedad, removerá


automáticamente el usuario junto con todos los posts asociados al mismo tiempo.

Ésta propiedad se debe definir en la tabla secundaria, es decir, la que contenga la llave
foránea.

También podría gustarte