JPA - ส่วนประกอบ ORM

แอปพลิเคชันร่วมสมัยส่วนใหญ่ใช้ฐานข้อมูลเชิงสัมพันธ์ในการจัดเก็บข้อมูล เมื่อเร็ว ๆ นี้ผู้ขายจำนวนมากเปลี่ยนมาใช้ฐานข้อมูลออบเจ็กต์เพื่อลดภาระในการดูแลรักษาข้อมูล หมายความว่าฐานข้อมูลวัตถุหรือเทคโนโลยีเชิงสัมพันธ์ของวัตถุกำลังดูแลการจัดเก็บการเรียกคืนการอัปเดตและการบำรุงรักษา ส่วนหลักของเทคโนโลยีเชิงสัมพันธ์ออบเจ็กต์นี้คือการแม็พไฟล์ orm.xml เนื่องจาก xml ไม่ต้องการการคอมไพล์เราจึงสามารถทำการเปลี่ยนแปลงแหล่งข้อมูลหลายแหล่งได้อย่างง่ายดายโดยมีการดูแลน้อยลง

การแม็ปเชิงสัมพันธ์ของวัตถุ

Object Relational Mapping (ORM) จะบอกคุณสั้น ๆ เกี่ยวกับ ORM คืออะไรและทำงานอย่างไร ORM คือความสามารถในการเขียนโปรแกรมเพื่อปกปิดข้อมูลจากประเภทออบเจ็กต์เป็นประเภทเชิงสัมพันธ์และในทางกลับกัน

คุณสมบัติหลักของ ORM คือการแมปหรือผูกวัตถุเข้ากับข้อมูลในฐานข้อมูล ในขณะที่การทำแผนที่เราต้องพิจารณาข้อมูลประเภทของข้อมูลและความสัมพันธ์กับเอนทิตีตนเองหรือเอนทิตีในตารางอื่น ๆ

คุณสมบัติขั้นสูง

  • Idiomatic persistence : ช่วยให้คุณสามารถเขียนคลาสการคงอยู่โดยใช้คลาสเชิงวัตถุ

  • High Performance : มันมีเทคนิคการดึงข้อมูลมากมายและเทคนิคการล็อกแบบหวังผล

  • Reliable: มีความเสถียรสูงและโดดเด่น ใช้โดยโปรแกรมเมอร์อุตสาหกรรมจำนวนมาก

สถาปัตยกรรม ORM

ตามสถาปัตยกรรม ORM ที่นี่

สถาปัตยกรรมข้างต้นอธิบายถึงวิธีการจัดเก็บข้อมูลวัตถุในฐานข้อมูลเชิงสัมพันธ์ในสามขั้นตอน

ขั้นตอนที่ 1

ระยะแรกมีชื่อว่า Object dataเฟสประกอบด้วยคลาส POJO อินเตอร์เฟสบริการและคลาส เป็นเลเยอร์องค์ประกอบทางธุรกิจหลักซึ่งมีการดำเนินการทางตรรกะและคุณลักษณะทางธุรกิจ

ตัวอย่างเช่นให้เราใช้ฐานข้อมูลพนักงานเป็น schema-

  • คลาส POJO ของพนักงานประกอบด้วยแอตทริบิวต์เช่น ID ชื่อเงินเดือนและการกำหนด และวิธีการเช่น setter และ getter method ของแอตทริบิวต์เหล่านั้น

  • คลาส DAO / บริการของพนักงานประกอบด้วยวิธีการบริการเช่นสร้างพนักงานค้นหาพนักงานและลบพนักงาน

ระยะที่ 2

ระยะที่สองตั้งชื่อว่า mapping หรือ persistence เฟสซึ่งมีผู้ให้บริการ JPA, ไฟล์การแมป (ORM.xml), JPA Loader และ Object Grid

  • JPA Provider: ผลิตภัณฑ์ของผู้ขายที่มีรส JPA (javax.persistence) ตัวอย่างเช่น Eclipselink, Toplink, Hibernate เป็นต้น

  • Mapping file : ไฟล์การแมป (ORM.xml) มีคอนฟิกูเรชันการแม็พระหว่างข้อมูลในคลาส POJO และข้อมูลในฐานข้อมูลเชิงสัมพันธ์

  • JPA Loader: ตัวโหลด JPA ทำงานเหมือนหน่วยความจำแคชซึ่งสามารถโหลดข้อมูลกริดเชิงสัมพันธ์ได้ ทำงานเหมือนสำเนาของฐานข้อมูลเพื่อโต้ตอบกับคลาสบริการสำหรับข้อมูล POJO (แอตทริบิวต์ของคลาส POJO)

  • Object Grid: Object grid เป็นตำแหน่งชั่วคราวที่สามารถจัดเก็บสำเนาของข้อมูลเชิงสัมพันธ์เช่นหน่วยความจำแคช การสอบถามทั้งหมดกับฐานข้อมูลจะมีผลกับข้อมูลในตารางวัตถุก่อน หลังจากที่มีการยืนยันแล้วก็จะส่งผลต่อฐานข้อมูลหลัก

ระยะที่ 3

เฟสที่สามคือเฟสข้อมูลเชิงสัมพันธ์ ประกอบด้วยข้อมูลเชิงสัมพันธ์ซึ่งเชื่อมต่อกับองค์ประกอบทางธุรกิจอย่างมีเหตุผล ดังที่ได้กล่าวไว้ข้างต้นเฉพาะเมื่อองค์ประกอบทางธุรกิจส่งข้อมูลข้อมูลจะถูกเก็บไว้ในฐานข้อมูลทางกายภาพ ก่อนหน้านั้นข้อมูลที่แก้ไขจะถูกเก็บไว้ในหน่วยความจำแคชเป็นรูปแบบกริด กระบวนการรับข้อมูลก็เช่นเดียวกัน

กลไกของการโต้ตอบแบบเป็นโปรแกรมของสามขั้นตอนข้างต้นเรียกว่าการทำแผนที่เชิงสัมพันธ์ของวัตถุ

Mapping.xml

ไฟล์ mapping.xml คือการสั่งให้ผู้ขาย JPA สำหรับการแมปคลาสเอนทิตีกับตารางฐานข้อมูล

ให้เรายกตัวอย่างเอนทิตีพนักงานซึ่งมีคุณสมบัติสี่ประการ คลาส POJO ของเอนทิตีพนักงานชื่อEmployee.java มีดังนี้:

public class Employee {

   private int eid;
   private String ename;
   private double salary;
   private String deg;

   public Employee(int eid, String ename, double salary, String deg) {
      super( );
      this.eid = eid;
      this.ename = ename;
      this.salary = salary;
      this.deg = deg;
   }

   public Employee( ) {
      super();
   }

   public int getEid( ) {
      return eid;
   }
   
   public void setEid(int eid) {
      this.eid = eid;
   }
   
   public String getEname( ) {
      return ename;
   }
   
   public void setEname(String ename) {
      this.ename = ename;
   }

   public double getSalary( ) {
      return salary;
   }
   
   public void setSalary(double salary) {
      this.salary = salary;
   }

   public String getDeg( ) {
      return deg;
   }
   
   public void setDeg(String deg) {
      this.deg = deg;
   }
}

รหัสด้านบนคือคลาส POJO เอนทิตีของพนักงาน ประกอบด้วยสี่คุณลักษณะ eid, ename, เงินเดือนและ deg พิจารณาว่าแอตทริบิวต์เหล่านี้คือช่องตารางในฐานข้อมูลและ eid เป็นคีย์หลักของตารางนี้ ตอนนี้เราต้องออกแบบไฟล์แผนที่ไฮเบอร์เนตให้มัน ไฟล์การแมปชื่อmapping.xml มีดังนี้:

<? xml version="1.0" encoding="UTF-8" ?>

<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm    
   http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
   version="1.0">
      
   <description> XML Mapping file</description>
      
   <entity class="Employee">        
      <table name="EMPLOYEETABLE"/>
      <attributes>
      
         <id name="eid">
            <generated-value strategy="TABLE"/>
         </id>

         <basic name="ename">
            <column name="EMP_NAME" length="100"/>
         </basic>
         
         <basic name="salary">
         </basic>
         
         <basic name="deg">
         </basic>
         
      </attributes>
   </entity>
   
</entity-mappings>

สคริปต์ด้านบนสำหรับการแมปคลาสเอนทิตีกับตารางฐานข้อมูล ในไฟล์นี้

  • <entity-mappings> : tag กำหนดข้อกำหนด schema เพื่ออนุญาตให้แท็กเอนทิตีลงในไฟล์ xml

  • <description> : tag กำหนดคำอธิบายเกี่ยวกับแอปพลิเคชัน

  • <entity>: tag กำหนดคลาสเอนทิตีที่คุณต้องการแปลงเป็นตารางในฐานข้อมูล คลาสแอตทริบิวต์กำหนดชื่อคลาสเอนทิตี POJO

  • <table>: tag กำหนดชื่อตาราง หากคุณต้องการเก็บชื่อคลาสเป็นชื่อตารางก็ไม่จำเป็นต้องใช้แท็กนี้

  • <attributes> : tag กำหนดแอตทริบิวต์ (ฟิลด์ในตาราง)

  • <id>: tag กำหนดคีย์หลักของตาราง <generated-value> แท็กกำหนดวิธีการกำหนดค่าคีย์หลักเช่นอัตโนมัติด้วยตนเองหรือนำมาจากลำดับ

  • <basic> : tag ใช้สำหรับกำหนดแอตทริบิวต์ที่เหลือสำหรับตาราง

  • <column-name> : tag ใช้เพื่อกำหนดชื่อฟิลด์ตารางที่ผู้ใช้กำหนด

คำอธิบายประกอบ

โดยทั่วไปไฟล์ Xml จะใช้ในการกำหนดค่าคอมโพเนนต์เฉพาะหรือการแม็พคุณสมบัติที่แตกต่างกันสองอย่าง ในกรณีของเราเราต้องดูแล xml แยกกันในกรอบ นั่นหมายความว่าในขณะที่เขียนไฟล์ xml การแมปเราจำเป็นต้องเปรียบเทียบแอตทริบิวต์คลาส POJO กับแท็กเอนทิตีในไฟล์ mapping.xml

นี่คือวิธีแก้ปัญหา: ในนิยามคลาสเราสามารถเขียนส่วนการกำหนดค่าโดยใช้คำอธิบายประกอบ คำอธิบายประกอบใช้สำหรับคลาสคุณสมบัติและวิธีการ คำอธิบายประกอบขึ้นต้นด้วยสัญลักษณ์ "@" มีการประกาศคำอธิบายประกอบก่อนที่จะประกาศคลาสคุณสมบัติหรือวิธีการ คำอธิบายประกอบทั้งหมดของ JPA ถูกกำหนดไว้ในแพ็คเกจ javax.persistence

ต่อไปนี้เป็นรายการคำอธิบายประกอบที่ใช้ในตัวอย่างของเรา

คำอธิบายประกอบ คำอธิบาย
@ เอนทิตี้ คำอธิบายประกอบนี้ระบุเพื่อประกาศคลาสเป็นเอนทิตีหรือตาราง
@ตาราง คำอธิบายประกอบนี้ระบุเพื่อประกาศชื่อตาราง
@ขั้นพื้นฐาน คำอธิบายประกอบนี้ระบุฟิลด์ที่ไม่ใช่ข้อ จำกัด อย่างชัดเจน
@ ฝัง คำอธิบายประกอบนี้ระบุคุณสมบัติของคลาสหรือเอนทิตีที่มีอินสแตนซ์ค่าของคลาสที่ฝังได้
@Id คำอธิบายประกอบนี้ระบุคุณสมบัติใช้สำหรับเอกลักษณ์ (คีย์หลักของตาราง) ของคลาส
@GeneratedValue คำอธิบายประกอบนี้ระบุวิธีการเตรียมใช้งานแอตทริบิวต์เอกลักษณ์เช่นอัตโนมัติด้วยตนเองหรือค่าที่นำมาจากตารางลำดับ
@ชั่วคราว คำอธิบายประกอบนี้ระบุคุณสมบัติที่ไม่คงอยู่นั่นคือค่าจะไม่ถูกเก็บไว้ในฐานข้อมูล
@คอลัมน์ คำอธิบายประกอบนี้ใช้เพื่อระบุคอลัมน์หรือแอตทริบิวต์สำหรับคุณสมบัติการคงอยู่
@SequenceGenerator คำอธิบายประกอบนี้ใช้เพื่อกำหนดค่าสำหรับคุณสมบัติที่ระบุไว้ในคำอธิบายประกอบ @GeneratedValue มันสร้างลำดับ
@TableGenerator คำอธิบายประกอบนี้ใช้เพื่อระบุตัวสร้างค่าสำหรับคุณสมบัติที่ระบุในคำอธิบายประกอบ @GeneratedValue สร้างตารางสำหรับการสร้างมูลค่า
@AccessType คำอธิบายประกอบประเภทนี้ใช้เพื่อตั้งค่าประเภทการเข้าถึง หากคุณตั้งค่า @AccessType (FIELD) การเข้าถึงที่ชาญฉลาดของฟิลด์จะเกิดขึ้น หากคุณตั้งค่า @AccessType (PROPERTY) การประเมินทรัพย์สินที่ชาญฉลาดจะเกิดขึ้น
@JoinColumn คำอธิบายประกอบนี้ใช้เพื่อระบุการเชื่อมโยงเอนทิตีหรือการรวบรวมเอนทิตี สิ่งนี้ใช้ในการเชื่อมโยงแบบกลุ่มต่อหนึ่งและแบบหนึ่งต่อหลาย
@UniqueConstraint คำอธิบายประกอบนี้ใช้เพื่อระบุฟิลด์ข้อ จำกัด เฉพาะสำหรับตารางหลักหรือรอง
@ColumnResult คำอธิบายประกอบนี้อ้างอิงชื่อของคอลัมน์ในแบบสอบถาม SQL โดยใช้ส่วนคำสั่งเลือก
@ManyToMany คำอธิบายประกอบนี้ใช้เพื่อกำหนดความสัมพันธ์แบบกลุ่มต่อกลุ่มระหว่างตารางการเข้าร่วม
@ManyToOne คำอธิบายประกอบนี้ใช้เพื่อกำหนดความสัมพันธ์แบบกลุ่มต่อหนึ่งระหว่างตารางการรวม
@OneToMany คำอธิบายประกอบนี้ใช้เพื่อกำหนดความสัมพันธ์แบบหนึ่งต่อกลุ่มระหว่างตารางการรวม
@หนึ่งต่อหนึ่ง คำอธิบายประกอบนี้ใช้เพื่อกำหนดความสัมพันธ์แบบหนึ่งต่อหนึ่งระหว่างตารางการรวม
@NamedQueries คำอธิบายประกอบนี้ใช้สำหรับระบุรายการคิวรีที่ระบุชื่อ
@NamedQuery คำอธิบายประกอบนี้ใช้สำหรับระบุแบบสอบถามโดยใช้ชื่อแบบคงที่

มาตรฐาน Java Bean

คลาส Java ห่อหุ้มค่าอินสแตนซ์และพฤติกรรมไว้ในอ็อบเจ็กต์ที่เรียกหน่วยเดียว Java Bean เป็นหน่วยเก็บข้อมูลชั่วคราวและส่วนประกอบที่ใช้ซ้ำได้หรือวัตถุ เป็นคลาสที่ทำให้เป็นอนุกรมได้ซึ่งมีตัวสร้างเริ่มต้นและเมธอด getter & setter เพื่อเริ่มต้นแอ็ตทริบิวต์อินสแตนซ์ทีละรายการ

อนุสัญญาถั่ว

  • Bean มีตัวสร้างเริ่มต้นหรือไฟล์ที่มีอินสแตนซ์แบบอนุกรม ดังนั้นถั่วสามารถสร้างอินสแตนซ์ของถั่วได้

  • คุณสมบัติของถั่วสามารถแยกออกเป็นคุณสมบัติบูลีนและคุณสมบัติที่ไม่ใช่บูลีน

  • คุณสมบัติที่ไม่ใช่บูลีนประกอบด้วย getter และ setter วิธีการ

  • คุณสมบัติบูลีนประกอบด้วย setter และ is วิธี.

  • Getterวิธีการของคุณสมบัติใด ๆ ควรเริ่มต้นด้วย 'get' (ข้อตกลงวิธีการ java) ตัวอักษรขนาดเล็กและต่อด้วยชื่อฟิลด์ที่ขึ้นต้นด้วยอักษรตัวใหญ่ เช่นชื่อฟิลด์คือ 'เงินเดือน' ดังนั้นเมธอด getter ของฟิลด์นี้คือ 'getSalary ()'

  • Setterวิธีการของคุณสมบัติใด ๆ ควรเริ่มต้นด้วย 'set' ตัวอักษรขนาดเล็ก (java method convention) ต่อด้วยชื่อฟิลด์ที่ขึ้นต้นด้วยอักษรตัวใหญ่และค่าอาร์กิวเมนต์ที่จะตั้งค่าเป็นฟิลด์ เช่นชื่อฟิลด์คือ 'เงินเดือน' ดังนั้นเมธอด setter ของฟิลด์นี้คือ 'setSalary (double sal)'

  • สำหรับคุณสมบัติบูลีนคือวิธีการตรวจสอบว่าเป็นจริงหรือเท็จ เช่นคุณสมบัติบูลีน 'ว่าง' เมธอดคือของฟิลด์นี้คือ 'isEmpty ()'