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.