Връзка на ниво table

Нека отново да разгледаме нашите две таблици:

document за самоличност име професия заплата възраст дата на присъединяване
1 Ivanов Ivan Програмист 100 000 25 2012-06-30
2 Peterов Петър Програмист 80 000 23 2013-08-12
3 Ivanов Сергей Тестер 40 000 тридесет 2014-01-01
4 Рабинович Мойша Директор 200 000 35 2015-05-12
5 Кириенко Анастасия Офис мениджър 40 000 25 2015-10-10
6 Васка котка 1000 3 2018-11-11

маса на служителите:

Тази table има следните колони:

  • id INT
  • име VARCHAR
  • занятие ВЪРЧА
  • заплата INT
  • възраст INT
  • дата на присъединяване ДАТА

Ето How изглежда tableта със задачи , която съдържа задачи за служителите:

document за самоличност Emploee_id име краен срок
1 1 Коригиране на грешка във фронтенда 2022-06-01
2 2 Коригиране на грешка в бекенда 2022-06-15
3 5 Купи кафе 2022-07-01
4 5 Купи кафе 2022-08-01
5 5 Купи кафе 2022-09-01
6 (НУЛА) Почистете офиса (НУЛА)
7 4 Наслаждавай се на живота (НУЛА)
8 6 Наслаждавай се на живота (НУЛА)

Тази table има само 4 колони:

  • id е уникалният номер на задачата (и редовете в tableта).
  • employee_id - ID на служителя от tableта на служителите, към който е възложена задачата.
  • име - името и описанието на задачата.
  • краен срок - времето, до което задачата трябва да бъде изпълнена.

Единичен запис в tableта на служителите може да бъде препратен от много редове в tableта със задачи. Такава връзка на ниво table се нарича едно към много.

Връзка с нивото на Java клас

И нашите класове, клас Служител :

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

И класът EmployeeTask в оригиналната му форма:

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

@OneToMany анотация

Можем да организираме комуникацията между класовете Entity по различен начин.

Помните ли анотацията @ElementCollection , която използвахме, за да създадем колекция от дъщерни обекти в родителския клас? Нещо подобно може да се направи с анотацията @OneToMany . Само този път класът Служител ще бъде променен :

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

Използвайки анотацията @OneToMany , посочихме, че обектътслужителможе да съхранява много EmployeeTask обекти . Освен това, използвайки анотацията @JoinColumn , посочихме в коя колона на tableта със задачи се съхранява идентификаторът на обектаслужител.

Обаче класът EmployeeTask обикновено не съдържа поле, което препраща към колоната Employee_id. Пример:

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

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

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

Полето employee_id се счита за служебно поле и стойността му се контролира от Hibernate.

Поискайте примери

Ако искате да добавите няHowва задача към някой работник, тогава трябва да напишете code като този:

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

Първо създаваме два обекта EmployeeTask , записваме ги в базата данни и извикваме метода flush(), така че да се изпълни операцията INSERT и обектите да имат идентификатори.

След това намираме директора в базата данни, вземаме полето за задачи от него и добавяме две задачи към него. След това запазваме директора в базата данни. След това стойността 4 ще се появи в базата данни за нови задачи в колоната employee_id - идентификаторът на директора в tableта на служителите.

важно! Таблиците в базата данни са еднакви за анотациите @ManyToOne и @OneToMany . Но Java класовете за тези таблици са различни.