Relación a nivel de tabla
Veamos nuestras dos tablas de nuevo:
identificación | nombre | ocupación | salario | edad | Fecha de Ingreso |
---|---|---|---|---|---|
1 | ivanov ivan | Programador | 100000 | 25 | 2012-06-30 |
2 | petrov petr | Programador | 80000 | 23 | 2013-08-12 |
3 | Sergey Ivanov | Ensayador | 40000 | treinta | 2014-01-01 |
4 | Rabinovich Moisha | Director | 200000 | 35 | 2015-05-12 |
5 | Anastasia Kirienko | Gerente de oficina | 40000 | 25 | 2015-10-10 |
6 | Vaska | Gato | 1000 | 3 | 2018-11-11 |
mesa de empleados:
Esta tabla tiene las siguientes columnas:
- identificación INT
- nombre VARCHAR
- ocupación VARCHA
- salario INT
- edad INT
- unirse_fecha FECHA
Y así es como se ve la tabla de tareas , que contiene tareas para los empleados:
identificación | empleado_id | nombre | fecha límite |
---|---|---|---|
1 | 1 | Arreglar un error en la interfaz | 2022-06-01 |
2 | 2 | Arreglar un error en el backend | 2022-06-15 |
3 | 5 | comprar cafe | 2022-07-01 |
4 | 5 | comprar cafe | 2022-08-01 |
5 | 5 | comprar cafe | 2022-09-01 |
6 | (NULO) | limpiar la oficina | (NULO) |
7 | 4 | Disfruta la vida | (NULO) |
8 | 6 | Disfruta la vida | (NULO) |
Esta tabla tiene solo 4 columnas:
- id es el número único de la tarea (y filas en la tabla).
- employee_id : ID del empleado de la tabla de empleados a la que está asignada la tarea.
- nombre : el nombre y la descripción de la tarea.
- fecha límite : el tiempo en el que se debe completar la tarea.
Muchas filas en la tabla de tareas pueden hacer referencia a una sola entrada en la tabla de empleados. Esta relación a nivel de tabla se denomina de uno a muchos.
Relación con el nivel de clase de Java
Y nuestras clases, la clase Empleado :
@Entity
@Table(name="user")
class Employee {
@Column(name="id")
public Integer id;
@Column(name="name")
public String name;
@Column(name="occupation")
public String occupation;
@Column(name="salary")
public Integer salary;
@Column(name="join_date")
public Date join;
}
Y la clase EmployeeTask en su forma original:
@Entity
@Table(name="task")
class EmployeeTask {
@Column(name="id")
public Integer id;
@Column(name="name")
public String description;
@Column(name="employee_id")
public Integer employeeId;
@Column(name="deadline")
public Date deadline;
}
anotación @OneToMany
Podemos organizar la comunicación entre las clases de Entidad de una manera diferente.
¿Recuerda la anotación @ElementCollection que usamos para crear una colección de objetos secundarios en la clase principal? Se puede hacer algo similar con la anotación @OneToMany . Solo que esta vez, se cambiará la clase de empleado :
@Entity
@Table(name="user")
class Employee {
@Column(name="id")
public Integer id;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "employee_id")
private Set<EmployeeTask> tasks = new HashSet<EmployeeTask>();
}
Usando la anotación @OneToMany , indicamos que el objetoempleadopuede almacenar muchos objetos EmployeeTask . Además, usando la anotación @JoinColumn , indicamos en qué columna de la tabla de tareas se almacena la identificación del objetoempleado.
Sin embargo, la clase EmployeeTask normalmente no contiene un campo que haga referencia a la columna employee_id. Ejemplo:
@Entity
@Table(name="task")
class EmployeeTask {
@Column(name="id")
public Integer id;
@Column(name="name")
public String description;
@Column(name="deadline")
public Date deadline;
}
El campo employee_id se considera un campo de servicio y Hibernate controla su valor.
Solicitar ejemplos
Si desea agregar alguna tarea a algún trabajador, debe escribir un código como este:
EmployeeTask task1 = new EmployeeTask();
task1.description = "Do Something Important";
session.persist(task1);
EmployeeTask task2 = new EmployeeTask();
task2.description = "Nothing to do";
session.persist(task2);
session.flush();
Employee director = session.find(Employee.class, 4);
director.tasks.add(task1);
director.tasks.add(task2);
session.update(director);
session.flush();
Primero, creamos dos objetos EmployeeTask , los guardamos en la base de datos y llamamos al método flush() para que se realice la operación INSERT y los objetos tengan ID.
Luego encontramos al director en la base de datos, le quitamos el campo de tareas y le agregamos dos tareas. Luego guardamos el director en la base de datos. Después de eso, el valor 4 aparecerá en la base de datos para nuevas tareas en la columna employee_id: la identificación del director en la tabla de empleados.
¡Importante! Las tablas de la base de datos son las mismas para las anotaciones @ManyToOne y @OneToMany . Pero las clases de Java para estas tablas son diferentes.
GO TO FULL VERSION