Tema
Introducción
En este apartado se cubren los siguientes aspectos
Relaciones Muchos-a-Muchos
Herencia de entidades
Opcionalidad en las relaciones
Tipos de caché en Hibernate
Más sobre HQL
Optimizaciones de navegación entre entidades
Gestión de referencias
Persistencia transitiva
Patrón “Open Sessionin View”
Para ilustrar estos aspectos se utiliza como ejemplo
la capa modelo de una aplicación de recursos
humanos ficticia
Entidades
Project
- Las relaciones “a Muchos” se han
modelado con java.util.Set
(semántica: no orden predefinido y
no duplicados).
- Se supone que el número de
empleados de un departamento es
moderado y que el número de
proyectos en los que trabaja unempleado también.
- projectId : Long
- name : String
- startDate : Calendar
- endDate : Calendar
- version : long
0..n
0..n
Employee
- employeeId : Long
- firstName : String
- lastName : String
- position : String
- salary : int
- version : long
DistinguishedEmployee
- mentionDate : Calendar
- comment : String
Dirigido por
0..1
0..n
0..1
0..1Department
- departmentId : Long
- name : String
- creationDate : Calendar
- version : long
Estructura de paquetes (1)
es.udc.pojo.advhibernatetut
demo
model
department
hrservice
employee
project
util
test
model
Estructura de paquetes (y 2)
Además de las entidades, el ejemplo incluye
Un servicio (subpaquete hrservice) con operaciones para
Crear departamentos, empleados y proyectos
Hacer asignaciones (director de un departamento y empleado a
un proyecto)
Realizar consultas
Realizar borrados en masa
Un sencillo cliente Web de prueba (subpaquete demo)
Dos casos de prueba (subpaquete test) para el servicio del
modelo
Tablas
(PK)
(FK)
depId
dirId
name
creationDate
version
Tabla = DepartmentRelación “Department(0..1)--[Dirigido por]-->Employee(0..1)”
(PK)
(FK)
empId
depId
Relación “Department(0..1)Employee(0..N)”
firstName
lastName
position
salary
version
Tabla = Employee
Herencia entre Employee y DistinguishedEmployee
empId
prjId
comment
Tabla = DSTEmployee
(PK, FK)
(PK, FK)
empId
mentionDate
Tabla = EmpPrj
(PK, FK)
Relación“Employee(0..N)Project(0..N)”
(PK)
prjId
name
startDate
endDate
version
Tabla = Project
Relación “Employee(0..N)Project(0..N)” (1)
En Project
@Entity
public class Project {
// ...
@ManyToMany
@JoinTable(name = "EmpPrj", joinColumns = @JoinColumn(name = "prjId"),
inverseJoinColumns = @JoinColumn(name = "empId"))
public Set getEmployees() {
return employees;
}
publicvoid setEmployees(Set employees) {
this.employees = employees;
}
// ...
}
Relación “Employee(0..N)Project(0..N)” (2)
En Employee
@Entity
public class Employee {
// ...
@ManyToMany(mappedBy="employees")
public Set getProjects() {
return projects;
}
public void setProjects(Set projects) {
this.projects = projects;
}
// ...
}
Relación “Employee(0..N)Project(0..N)”(3)
Relaciones Muchos-a-Muchos
Se utiliza @ManyToMany sobre los campos/propiedades que
definen la relación
Si la relación es unidireccional, el lado propietario es el que
permite navegar hacia el otro
Si la relación es bidireccional, se puede elegir cualquier lado
como propietario (y el otro será el lado inverso)
En el ejemplo, la relación esbidireccional y se ha elegido
Project como lado propietario
En Employee (lado inverso)
@ManyToMany(mappedBy="employees") sobre
getProjects
Relación “Employee(0..N)Project(0..N)” (y 4)
Relaciones Muchos-a-Muchos (cont)
En Project (lado propietario), además de @ManyToMany,
se utiliza @JoinTable sobre getEmployees
name: nombre de la tabla en la que se mapea...
Regístrate para leer el documento completo.