Relacionamento em nível de tabela

Vamos olhar para nossas duas tabelas novamente:

eu ia nome ocupação salário idade data de afiliação
1 Ivanov Ivan Programador 100000 25 30/06/2012
2 Petrov Petr Programador 80000 23 12/08/2013
3 Ivanov Sergei Testador 40000 trinta 2014-01-01
4 Rabinovich Moisha Diretor 200000 35 2015-05-12
5 Kirienko Anastácia Gerente 40000 25 2015-10-10
6 Vaska Gato 1000 3 2018-11-11

tabela de funcionários:

Esta tabela tem as seguintes colunas:

  • id INT
  • nome VARCHAR
  • ocupação VARCHA
  • salário INT
  • idade INT
  • data_de_entrada DATE

E é assim que fica a tabela de tarefas , que contém as tarefas para os funcionários:

eu ia id_funcionário nome prazo final
1 1 Corrigir um bug no front-end 01/06/2022
2 2 Corrigir um bug no back-end 15/06/2022
3 5 comprar café 01/07/2022
4 5 comprar café 01/08/2022
5 5 comprar café 01/09/2022
6 (NULO) Limpe o escritório (NULO)
7 4 Aproveite a vida (NULO)
8 6 Aproveite a vida (NULO)

Esta tabela tem apenas 4 colunas:

  • id é o número exclusivo da tarefa (e linhas na tabela).
  • employee_id - ID do funcionário da tabela de funcionários à qual a tarefa está atribuída.
  • nome - o nome e a descrição da tarefa.
  • deadline - o tempo em que a tarefa deve ser concluída.

Uma única entrada na tabela de funcionários pode ser referenciada por muitas linhas na tabela de tarefas. Esse relacionamento em nível de tabela é chamado de um para muitos.

Relação com o nível de classe Java

E nossas classes, a classe Employee :

@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;
}

E a classe EmployeeTask em sua 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;
}

Anotação @OneToMany

Podemos organizar a comunicação entre as classes Entity de uma maneira diferente.

Lembra da anotação @ElementCollection que usamos para criar uma coleção de objetos filho na classe pai? Algo semelhante pode ser feito com a anotação @OneToMany . Só que desta vez, a classe Employee será alterada :

@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 a anotação @OneToMany , indicamos que o objetofuncionáriopode armazenar muitos objetos EmployeeTask . Além disso, usando a anotação @JoinColumn , indicamos em qual coluna da tabela de tarefas o ID do objeto está armazenadofuncionário.

No entanto, a classe EmployeeTask geralmente não contém um campo que se refira à coluna employee_id. Exemplo:

@Entity
@Table(name="task")
class EmployeeTask {
   @Column(name="id")
   public Integer id;

   @Column(name="name")
   public String description;

   @Column(name="deadline")
   public Date deadline;
}

O campo Employees_id é considerado um campo de serviço e seu valor é controlado pelo Hibernate.

Solicitar exemplos

Se você quiser adicionar alguma tarefa a algum trabalhador, precisará escrever um 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();

Primeiro, criamos dois objetos EmployeeTask , salvamos no banco de dados e chamamos o método flush() para que a operação INSERT seja executada e os objetos tenham IDs.

Em seguida, encontramos o diretor no banco de dados, pegamos o campo de tarefas dele e adicionamos duas tarefas a ele. Em seguida, salvamos o diretor no banco de dados. Depois disso, o valor 4 aparecerá no banco de dados para novas tarefas na coluna employee_id - o id do diretor na tabela de funcionários.

Importante! As tabelas no banco de dados são as mesmas para as anotações @ManyToOne e @OneToMany . Mas as classes Java para essas tabelas são diferentes.