Mối quan hệ cấp độ bảng

Hãy xem lại hai bảng của chúng ta:

nhận dạng tên nghề nghiệp lương tuổi ngày tham gia
1 Ivanov Ivan lập trình viên 100000 25 30-06-2012
2 Petrov Petr lập trình viên 80000 23 2013-08-12
3 Ivanov Serge Kiểm thử 40000 ba mươi 2014-01-01
4 Rabinovich Moisha Giám đốc 200000 35 2015-05-12
5 kirienko anastasia Quản lý văn phòng 40000 25 2015-10-10
6 Vaska Con mèo 1000 3 2018-11-11

bảng nhân viên:

Bảng này có các cột sau:

  • id INT
  • tên VARCHAR
  • nghề nghiệp VARCHA
  • tiền lương
  • tuổi INT
  • join_date NGÀY

Và đây là cách bảng nhiệm vụ , chứa các nhiệm vụ cho nhân viên, trông như thế nào:

nhận dạng nhân viên_id tên thời hạn
1 1 Sửa lỗi ở frontend 2022-06-01
2 2 Sửa lỗi trên backend 2022-06-15
3 5 Mua cà phê 2022-07-01
4 5 Mua cà phê 2022-08-01
5 5 Mua cà phê 2022-09-01
6 (VÔ GIÁ TRỊ) Dọn dẹp văn phòng (VÔ GIÁ TRỊ)
7 4 Tận hưởng cuộc sống (VÔ GIÁ TRỊ)
số 8 6 Tận hưởng cuộc sống (VÔ GIÁ TRỊ)

Bảng này chỉ có 4 cột:

  • id là số duy nhất của tác vụ (và các hàng trong bảng).
  • employee_id - ID của nhân viên từ bảng nhân viên mà nhiệm vụ được giao.
  • name - tên và mô tả của nhiệm vụ.
  • thời hạn - thời gian mà nhiệm vụ phải được hoàn thành.

Một mục trong bảng nhân viên có thể được tham chiếu bởi nhiều hàng trong bảng nhiệm vụ. Mối quan hệ cấp độ bảng như vậy được gọi là một- nhiều.

Mối quan hệ với cấp độ lớp Java

Và các lớp của chúng tôi, lớp Nhân viên :

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

Và lớp EmployeeTask ở dạng ban đầu:

@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 chú thích

Chúng ta có thể sắp xếp giao tiếp giữa các lớp Thực thể theo một cách khác.

Bạn có nhớ chú thích @ElementCollection mà chúng ta đã sử dụng để tạo một tập hợp các đối tượng con trong lớp cha không? Điều gì đó tương tự có thể được thực hiện với chú thích @OneToMany . Chỉ lần này, lớp Nhân viên sẽ được thay đổi :

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

Sử dụng chú thích @OneToMany , chúng tôi đã chỉ ra rằng đối tượngngười lao độngcó thể lưu trữ nhiều đối tượng EmployeeTask . Ngoài ra, bằng cách sử dụng chú thích @JoinColumn , chúng tôi đã chỉ ra id đối tượng được lưu trữ trong cột nào của bảng tác vụngười lao động.

Tuy nhiên, lớp EmployeeTask thường không chứa trường đề cập đến cột employee_id. Ví dụ:

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

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

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

Trường employee_id được coi là trường dịch vụ và giá trị của nó được kiểm soát bởi Hibernate.

yêu cầu ví dụ

Nếu bạn muốn thêm một số nhiệm vụ cho một số nhân viên, thì bạn cần viết mã như sau:

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

Đầu tiên, chúng ta tạo hai đối tượng EmployeeTask , lưu chúng vào cơ sở dữ liệu và gọi phương thức flush() để thao tác INSERT được thực hiện và các đối tượng có ID.

Sau đó, chúng tôi tìm giám đốc trong cơ sở dữ liệu, lấy trường nhiệm vụ từ anh ta và thêm hai nhiệm vụ cho anh ta. Sau đó, chúng tôi lưu giám đốc vào cơ sở dữ liệu. Sau đó, giá trị 4 sẽ xuất hiện trong cơ sở dữ liệu cho các nhiệm vụ mới trong cột employee_id - id của giám đốc trong bảng nhân viên.

Quan trọng! Các bảng trong cơ sở dữ liệu giống nhau đối với các chú thích @ManyToOne@OneToMany . Nhưng các lớp Java cho các bảng này là khác nhau.