Връзка на ниво 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 класовете за тези таблици са различни.
GO TO FULL VERSION