Relacja na poziomie tabeli

Spójrzmy ponownie na nasze dwie tabele:

ID nazwa zawód wynagrodzenie wiek data_dołączenia
1 Iwanow Iwan Programista 100000 25 2012-06-30
2 Pietrow Pietr Programista 80000 23 2013-08-12
3 Iwanow Siergiej Próbnik 40000 trzydzieści 2014-01-01
4 Rabinowicz Mojsza Dyrektor 200000 35 2015-05-12
5 Kirienko Anastazja Kierownik biura 40000 25 2015-10-10
6 Vaska Kot 1000 3 2018-11-11

stół pracowniczy:

Ta tabela ma następujące kolumny:

  • identyfikator INT
  • imię VARCHAR
  • zawód WARCHA
  • wynagrodzenie INT
  • wiek INT
  • data_dołączenia DATA

A tak wygląda tabela zadań , która zawiera zadania dla pracowników:

ID identyfikator_pracownika nazwa termin ostateczny
1 1 Napraw błąd w interfejsie użytkownika 2022-06-01
2 2 Napraw błąd w backendzie 2022-06-15
3 5 Kup kawę 2022-07-01
4 5 Kup kawę 2022-08-01
5 5 Kup kawę 2022-09-01
6 (ZERO) Posprzątaj biuro (ZERO)
7 4 Ciesz się życiem (ZERO)
8 6 Ciesz się życiem (ZERO)

Ta tabela ma tylko 4 kolumny:

  • id to unikalny numer zadania (i wierszy w tabeli).
  • id_pracownika - identyfikator pracownika z tabeli pracowników, do którego jest przypisane zadanie.
  • name - nazwa i opis zadania.
  • termin – czas, w jakim zadanie musi zostać wykonane.

Do pojedynczego wpisu w tabeli pracowników może odwoływać się wiele wierszy w tabeli zadań. Taka relacja na poziomie tabeli nazywana jest jeden-do -wielu.

Związek z poziomem klasy Java

A nasze klasy, klasa Pracownik :

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

I klasa EmployeeTask w oryginalnej postaci:

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

Adnotacja @OneToMany

Komunikację pomiędzy klasami Entity możemy zorganizować w inny sposób.

Pamiętasz adnotację @ElementCollection , której użyliśmy do stworzenia kolekcji obiektów podrzędnych w klasie nadrzędnej? Coś podobnego można zrobić za pomocą adnotacji @OneToMany . Tylko tym razem klasa Pracownik zostanie zmieniona :

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

Za pomocą adnotacji @OneToMany wskazaliśmy, że obiektpracownikmoże przechowywać wiele obiektów EmployeeTask . Ponadto za pomocą adnotacji @JoinColumn wskazaliśmy w której kolumnie tabeli zadań przechowywany jest identyfikator obiektupracownik.

Jednak klasa EmployeeTask zazwyczaj nie zawiera pola odnoszącego się do kolumny id_pracownika. Przykład:

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

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

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

Pole id_pracownika jest uważane za pole usługi, a jego wartość jest kontrolowana przez Hibernate.

Poproś o przykłady

Jeśli chcesz dodać jakieś zadanie do jakiegoś pracownika, musisz napisać taki kod:

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();

Najpierw tworzymy dwa obiekty EmployeeTask , zapisujemy je w bazie danych i wywołujemy metodę flush() tak, aby została wykonana operacja INSERT i obiekty miały identyfikatory.

Następnie znajdujemy dyrektora w bazie danych, odbieramy od niego pole zadań i dodajemy do niego dwa zadania. Następnie zapisujemy dyrektora do bazy danych. Następnie w bazie danych dla nowych zadań w kolumnie id_pracownika pojawi się wartość 4 - id dyrektora w tabeli pracowników.

Ważny! Tabele w bazie danych są takie same dla adnotacji @ManyToOne i @OneToMany . Ale klasy Java dla tych tabel są różne.