ความสัมพันธ์ระดับตาราง
มาดูตารางทั้งสองของเราอีกครั้ง:
รหัส | ชื่อ | อาชีพ | เงินเดือน | อายุ | เข้าร่วม_วันที่ |
---|---|---|---|---|---|
1 | อีวานอฟ อีวาน | โปรแกรมเมอร์ | 100,000 | 25 | 2555-06-30 |
2 | เปตรอฟ เปตรอฟ | โปรแกรมเมอร์ | 80000 | 23 | 2013-08-12 |
3 | อีวานอฟ เซอร์เกย์ | เทสเตอร์ | 40000 | สามสิบ | 2014-01-01 |
4 | ราบิโนวิช มอยชา | ผู้อำนวยการ | 200,000 | 35 | 2015-05-12 |
5 | คิเรียนโก อนาสตาเซีย | ผู้จัดการสำนักงาน | 40000 | 25 | 2015-10-10 |
6 | วาสก้า | แมว | 1,000 | 3 | 2018-11-11 |
ตารางพนักงาน:
ตารางนี้มีคอลัมน์ต่อไปนี้:
- รหัส INT
- ชื่อวาร์ชาร์
- อาชีพ VARCHA
- INT เงินเดือน
- อายุ INT
- join_dateวันที่
และนี่คือลักษณะของตารางงานซึ่งมีงานสำหรับพนักงาน มีลักษณะดังนี้:
รหัส | พนักงาน_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 | ใช้ชีวิตให้สนุก | (โมฆะ) |
ตารางนี้มีเพียง 4 คอลัมน์:
- idคือหมายเลขเฉพาะของงาน (และแถวในตาราง)
- Employee_id - ID ของพนักงานจากตารางพนักงานที่มอบหมายงานให้
- ชื่อ - ชื่อและรายละเอียดของงาน
- เส้นตาย - เวลาที่ต้องทำงานให้เสร็จ
รายการเดียวในตารางพนักงานสามารถอ้างอิงได้หลายแถวในตารางงาน ความสัมพันธ์ระดับตารางดังกล่าวเรียกว่าหนึ่งต่อกลุ่ม
ความสัมพันธ์กับระดับคลาส 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
เราสามารถจัดเตรียมการสื่อสารระหว่างคลาสของเอนทิตีด้วยวิธีอื่นได้
จำ คำอธิบาย ประกอบ @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เราระบุว่าคอลัมน์ใดของตารางงานที่จัดเก็บ ID วัตถุพนักงาน.
อย่างไรก็ตาม คลาส 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 ถือเป็นฟิลด์บริการและค่าจะถูกควบคุมโดยไฮเบอร์เนต
ขอตัวอย่าง
หากคุณต้องการเพิ่มงานให้กับพนักงาน คุณต้องเขียนโค้ดดังนี้:
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 ดำเนินการ และอ็อบเจ็กต์มี ID
จากนั้นเราจะพบผู้อำนวยการในฐานข้อมูล รับฟิลด์งานจากเขา และเพิ่มสองงานให้กับเขา จากนั้นเราบันทึกผู้อำนวยการลงในฐานข้อมูล หลังจากนั้นค่า 4 จะปรากฏในฐานข้อมูลสำหรับงานใหม่ในคอลัมน์ Employee_id - รหัสของผู้อำนวยการในตารางพนักงาน
สำคัญ! ตารางในฐานข้อมูลจะเหมือนกันสำหรับคำ อธิบายประกอบ @ManyToOneและ@OneToMany แต่คลาส Java สำหรับตารางเหล่านี้แตกต่างกัน
GO TO FULL VERSION