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):

  1. La entidad Company tiene una relación de composición (composite) con la entidad Departement:
    1. una compañía puede tener muchos departamentos (one to many)
    2. un departamento le pertenece a una única compañía (many to one)
  2. La entidad Departement tiene una relación de agregación (shared) con la entidad Employee:

    1. Un departamento tiene muchos empleados (one to many)
    2. Un empleado trabaja para un departamento (many to one)
  3. La primera relación, al ser un composite, queremos que si la compañía se borra, igualmente se borren los departamentos.

  4. 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:

@Entity public class CompanyEntity extends BaseEntity implements Serializable { @OneToMany(mappedBy = "company", cascade = CascadeType.ALL, orphanRemoval = true) private List<DepartmentEntity> departments = new ArrayList<>(); ... }

Ejemplo Department-Employee:

@Entity public class DepartmentEntity extends BaseEntity implements Serializable { ... @PodamExclude @OneToMany(mappedBy = "department") private List<EmployeeEntity> employees = new ArrayList<>(); ... }

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".

@Entity public class DepartmentEntity extends BaseEntity implements Serializable { @PodamExclude @ManyToOne private CompanyEntity 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:

results matching ""

    No results matching ""