ความสัมพันธ์ระดับตาราง

มาดูตารางทั้งสองของเราอีกครั้ง:

รหัส ชื่อ อาชีพ เงินเดือน อายุ เข้าร่วม_วันที่
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 สำหรับตารางเหล่านี้แตกต่างกัน