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 và @OneToMany . Nhưng các lớp Java cho các bảng này là khác nhau.
GO TO FULL VERSION