Relaciones entre las clases
Cada Relación entre las clases debe anotarse de acuerdo con la semántica de la relación. Si tomamos el modelo de clases del ejemplo company_back cuyo diagrama de clases está en la figura anterior, podemos ver que hay dos relaciones (bidireccionales):
- La entidad
Company
tiene una relación de composición (composite) con la entidadDepartement
:- una compañía puede tener muchos departamentos (one to many)
- un departamento le pertenece a una única compañía (many to one)
La entidad
Departement
tiene una relación de agregación (shared) con la entidadEmployee
:- Un departamento tiene muchos empleados (one to many)
- Un empleado trabaja para un departamento (many to one)
La primera relación, al ser un
composite
, queremos que si la compañía se borra, igualmente se borren los departamentos.- En la segunda relación, al ser
shared
, queremos que si el departamento se borra, no se borren los empleados.
Relaciones OneToMany
, ManyToMany
Sirven para anotar atributos cuyo tipo es una colección de objetos de alguna clase anotada con @Entity
.
Anotación | Descripción | Atributos |
---|---|---|
OneToMany | Se aplica sobre un atributo que representa una relación que indica que el objeto fuente, es decir el objeto de la clase que tiene el atributo, tiene una colección (many) de objetos de la clase del destino. | mappedBy : Indica el nombre del atributo en el destino que representa la relación inversa. |
cascade : Permite definir si las operaciones sobre la fuente se propagarán al destino. Por ejemplo si se borra la fuente que se borren los destinos. |
||
fetch : puede tener dos valores Lazy para indicar que los destinos no se cargan sino hasta cuando se necesitan o Eagear para indicar que los destinos se cargan al mismo tiempo con la fuente. |
||
orphanRemoval : no puede haber ningún objeto destino de esta relación que no tenga fuente. |
Ejemplo Company-Department:
Ejemplo Department-Employee:
Relaciones OneToOne
y ManyToOne
Sirven para anotar atributos cuyo tipo es una clase anotada con @Entity
.
Una relación OneToOne
en Java es cuando el objeto origen tiene un atributo que hace referencia a otro objeto destino. Las relaciones en Java y JPA son unidireccionales, es decir, si un objeto origen hace referencia a un objeto destino no existe ninguna garantía de que el objeto destino también tenga una relación hacia el objeto origen, a menos que la relación inversa sea definida explícitamente. Esto es diferente en una base de datos relacional, en el que las relaciones se definen a través de llaves foráneas y las consultas, en ambos sentidos, se pueden realizar utilizando estas llaves.
Ejemplo Department-Company:
Esta relación es la inversa de Company-Department donde se definió en el atributo mappedBy = "company"
.
Las tablas del ejemplo Company_Back
JPA construye el siguiente esquema de base de datos a partir de las anotaciones definidas en los atributos de las clases que representan las relaciones.
Dentro de Netbeans
en la base de datos Derby
tenemos la estructura relacional: