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