JPA - Thành phần ORM

Hầu hết các ứng dụng đương đại sử dụng cơ sở dữ liệu quan hệ để lưu trữ dữ liệu. Gần đây, nhiều nhà cung cấp chuyển sang cơ sở dữ liệu đối tượng để giảm bớt gánh nặng cho việc bảo trì dữ liệu. Nó có nghĩa là cơ sở dữ liệu đối tượng hoặc các công nghệ quan hệ đối tượng đang đảm nhận việc lưu trữ, truy xuất, cập nhật và bảo trì. Phần cốt lõi của công nghệ quan hệ đối tượng này là ánh xạ tệp orm.xml. Vì xml không yêu cầu biên dịch, chúng tôi có thể dễ dàng thực hiện thay đổi đối với nhiều nguồn dữ liệu với ít quản lý hơn.

Bản đồ quan hệ giữa các đối tượng

Ánh xạ quan hệ đối tượng (ORM) cho bạn biết ngắn gọn về ORM là gì và nó hoạt động như thế nào. ORM là một khả năng lập trình để che giấu dữ liệu từ kiểu đối tượng sang kiểu quan hệ và ngược lại.

Tính năng chính của ORM là ánh xạ hoặc liên kết một đối tượng với dữ liệu của nó trong cơ sở dữ liệu. Trong khi ánh xạ, chúng ta phải xem xét dữ liệu, kiểu dữ liệu và các mối quan hệ của nó với thực thể tự thân hoặc thực thể của nó trong bất kỳ bảng nào khác.

Các tính năng tiên tiến

  • Idiomatic persistence : Nó cho phép bạn viết các lớp bền bỉ bằng cách sử dụng các lớp hướng đối tượng.

  • High Performance : Nó có nhiều kỹ thuật tìm nạp và kỹ thuật khóa đầy hy vọng.

  • Reliable: Nó rất ổn định và nổi bật. Được sử dụng bởi nhiều lập trình viên công nghiệp.

Kiến trúc ORM

Ở đây tuân theo kiến ​​trúc ORM.

Kiến trúc trên giải thích cách dữ liệu đối tượng được lưu trữ vào cơ sở dữ liệu quan hệ trong ba giai đoạn.

Giai đoạn 1

Giai đoạn đầu tiên, được đặt tên là Object datapha chứa các lớp POJO, các giao diện dịch vụ và các lớp. Đây là lớp thành phần nghiệp vụ chính, có các hoạt động và thuộc tính logic nghiệp vụ.

Ví dụ, chúng ta hãy lấy một cơ sở dữ liệu nhân viên dưới dạng lược đồ-

  • Lớp POJO của nhân viên chứa các thuộc tính như ID, tên, lương và chỉ định. Và các phương thức như phương thức setter và getter của các thuộc tính đó.

  • Các lớp DAO / Service của nhân viên chứa các phương thức dịch vụ như tạo nhân viên, tìm nhân viên và xóa nhân viên.

Giai đoạn 2

Giai đoạn thứ hai có tên là mapping hoặc là persistence pha chứa nhà cung cấp JPA, tệp ánh xạ (ORM.xml), Bộ tải JPA và Lưới đối tượng.

  • JPA Provider: Sản phẩm của nhà cung cấp có chứa hương vị JPA (javax.persistence). Ví dụ: Eclipselink, Toplink, Hibernate, v.v.

  • Mapping file : Tệp ánh xạ (ORM.xml) chứa cấu hình ánh xạ giữa dữ liệu trong lớp POJO và dữ liệu trong cơ sở dữ liệu quan hệ.

  • JPA Loader: Bộ tải JPA hoạt động giống như bộ nhớ đệm, có thể tải dữ liệu lưới quan hệ. Nó hoạt động giống như một bản sao của cơ sở dữ liệu để tương tác với các lớp dịch vụ cho dữ liệu POJO (Các thuộc tính của lớp POJO).

  • Object Grid: Lưới đối tượng là một vị trí tạm thời có thể lưu trữ bản sao của dữ liệu quan hệ, tức là giống như một bộ nhớ đệm. Tất cả các truy vấn đối với cơ sở dữ liệu trước tiên được thực hiện trên dữ liệu trong lưới đối tượng. Chỉ sau khi nó được cam kết, nó sẽ ảnh hưởng đến cơ sở dữ liệu chính.

Giai đoạn 3

Giai đoạn thứ ba là giai đoạn dữ liệu quan hệ. Nó chứa dữ liệu quan hệ được kết nối logic với thành phần nghiệp vụ. Như đã thảo luận ở trên, chỉ khi thành phần nghiệp vụ cam kết dữ liệu, nó mới được lưu trữ vào cơ sở dữ liệu một cách vật lý. Cho đến lúc đó, dữ liệu đã sửa đổi được lưu trữ trong bộ nhớ đệm dưới dạng lưới. Tương tự là quá trình lấy dữ liệu.

Cơ chế tương tác theo chương trình của ba giai đoạn trên được gọi là ánh xạ quan hệ đối tượng.

Mapping.xml

Tệp mapping.xml là để hướng dẫn nhà cung cấp JPA ánh xạ các lớp Thực thể với các bảng cơ sở dữ liệu.

Hãy để chúng tôi lấy một ví dụ về thực thể Nhân viên chứa bốn thuộc tính. Lớp POJO của thực thể Nhân viên có tênEmployee.java là như sau:

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;
   }
}

Đoạn mã trên là lớp POJO của thực thể Nhân viên. Nó chứa bốn thuộc tính eid, ename, lương và deg. Hãy coi các thuộc tính này là các trường bảng trong cơ sở dữ liệu và eid là khóa chính của bảng này. Bây giờ chúng ta phải thiết kế tệp ánh xạ ngủ đông cho nó. Tệp ánh xạ có tênmapping.xml là như sau:

<? 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>

Tập lệnh trên để ánh xạ lớp thực thể với bảng cơ sở dữ liệu. Trong tập tin này

  • <entity-mappings> : thẻ xác định định nghĩa lược đồ để cho phép các thẻ thực thể vào tệp xml.

  • <description> : thẻ xác định mô tả về ứng dụng.

  • <entity>: thẻ định nghĩa lớp thực thể mà bạn muốn chuyển đổi thành bảng trong cơ sở dữ liệu. Lớp thuộc tính xác định tên lớp thực thể POJO.

  • <table>: thẻ xác định tên bảng. Nếu bạn muốn giữ tên lớp làm tên bảng thì thẻ này không cần thiết.

  • <attributes> : thẻ xác định các thuộc tính (các trường trong bảng).

  • <id>: thẻ xác định khóa chính của bảng. Các<generated-value> xác định cách chỉ định giá trị khóa chính, chẳng hạn như Tự động, Thủ công hoặc lấy từ Trình tự.

  • <basic> : thẻ được sử dụng để xác định các thuộc tính còn lại cho bảng.

  • <column-name> : thẻ được sử dụng để xác định tên trường bảng do người dùng xác định.

Chú thích

Nói chung, các tệp Xml được sử dụng để định cấu hình thành phần cụ thể hoặc ánh xạ hai thông số kỹ thuật khác nhau của các thành phần. Trong trường hợp của chúng tôi, chúng tôi phải duy trì xml riêng biệt trong một khuôn khổ. Điều đó có nghĩa là trong khi viết tệp xml ánh xạ, chúng ta cần so sánh các thuộc tính lớp POJO với các thẻ thực thể trong tệp mapping.xml.

Đây là giải pháp: Trong định nghĩa lớp, chúng ta có thể viết phần cấu hình bằng cách sử dụng chú thích. Các chú thích được sử dụng cho các lớp, thuộc tính và phương thức. Chú thích bắt đầu bằng ký hiệu '@'. Chú thích được khai báo trước khi khai báo lớp, thuộc tính hoặc phương thức. Tất cả các chú thích của JPA được định nghĩa trong gói javax.persistence.

Dưới đây là danh sách các chú thích được sử dụng trong các ví dụ của chúng tôi

Chú thích Sự miêu tả
@Entity Chú thích này chỉ định khai báo lớp dưới dạng thực thể hoặc bảng.
@Bàn Chú thích này chỉ định khai báo tên bảng.
@Căn bản Chú thích này chỉ định các trường không ràng buộc một cách rõ ràng.
@Embedded Chú thích này chỉ định các thuộc tính của lớp hoặc một thực thể có thể hiện giá trị của một lớp có thể nhúng.
@Tôi Chú thích này chỉ định thuộc tính, sử dụng cho danh tính (khóa chính của bảng) của lớp.
@GeneratedValue Chú thích này chỉ định, cách thuộc tính nhận dạng có thể được khởi tạo, chẳng hạn như Tự động, thủ công hoặc giá trị được lấy từ bảng trình tự.
@Tạm thời Chú thích này chỉ định thuộc tính không liên tục tức là giá trị không bao giờ được lưu trữ trong cơ sở dữ liệu.
@Cột Chú thích này được sử dụng để chỉ định cột hoặc thuộc tính cho thuộc tính kiên trì.
@SequenceGenerator Chú thích này được sử dụng để xác định giá trị cho thuộc tính được chỉ định trong chú thích @GeneratedValue. Nó tạo ra một chuỗi.
@TableGenerator Chú thích này được sử dụng để chỉ định trình tạo giá trị cho thuộc tính được chỉ định trong chú thích @GeneratedValue. Nó tạo ra một bảng để tạo giá trị.
@Loại truy cập Loại chú thích này được sử dụng để đặt loại truy cập. Nếu bạn đặt @AccessType (FIELD) thì quyền truy cập thông minh của Trường sẽ xảy ra. Nếu bạn đặt @AccessType (THUỘC TÍNH) thì đánh giá Tài sản khôn ngoan sẽ xảy ra.
@JoinColumn Chú thích này được sử dụng để chỉ định một liên kết thực thể hoặc tập hợp thực thể. Điều này được sử dụng trong nhiều hiệp hội-một và một-nhiều.
@Hạn chế duy nhất Chú thích này được sử dụng để chỉ định trường, ràng buộc duy nhất cho bảng chính hoặc phụ.
@ColumnResult Chú thích này tham chiếu đến tên của một cột trong truy vấn SQL bằng mệnh đề select.
@Nhiều nhiều Chú thích này được sử dụng để xác định mối quan hệ nhiều-nhiều giữa các Bảng nối.
@ManyToOne Chú thích này được sử dụng để xác định mối quan hệ nhiều-một giữa các Bảng nối.
@OneToMany Chú thích này được sử dụng để xác định mối quan hệ một-nhiều giữa các Bảng nối.
@OneToOne Chú thích này được sử dụng để xác định mối quan hệ một-một giữa các Bảng nối.
@NamedQueries Chú thích này được sử dụng để chỉ định danh sách các truy vấn được đặt tên.
@NamedQuery Chú thích này được sử dụng để chỉ định một Truy vấn sử dụng tên tĩnh.

Tiêu chuẩn Java Bean

Lớp Java, đóng gói các giá trị và hành vi cá thể vào một đối tượng được gọi đơn vị duy nhất. Java Bean là một thành phần lưu trữ tạm thời và có thể tái sử dụng hoặc một đối tượng. Nó là một lớp có thể tuần tự hóa, có phương thức khởi tạo và getter & setter mặc định để khởi tạo các thuộc tính cá thể riêng lẻ.

Quy ước về đậu

  • Bean chứa hàm tạo mặc định hoặc tệp có chứa phiên bản tuần tự hóa. Do đó, một hạt đậu có thể làm liền hạt đậu.

  • Các thuộc tính của bean có thể được tách biệt thành thuộc tính Boolean và thuộc tính không Boolean.

  • Thuộc tính không Boolean chứa gettersetter các phương pháp.

  • Thuộc tính boolean chứa setteris phương pháp.

  • Getterphương thức của bất kỳ thuộc tính nào nên bắt đầu bằng chữ cái nhỏ 'get' (quy ước phương thức java) và tiếp tục với tên trường bắt đầu bằng chữ hoa. Ví dụ: tên trường là 'lương' do đó phương thức getter của trường này là 'getSalary ()'.

  • Setterphương thức của bất kỳ thuộc tính nào phải bắt đầu bằng 'set' có chữ cái nhỏ (quy ước phương thức java), tiếp tục với tên trường bắt đầu bằng chữ hoa và giá trị đối số để đặt thành trường. Ví dụ: tên trường là 'lương' do đó phương thức setter của trường này là 'setSalary (double sal)'.

  • Đối với thuộc tính Boolean, là phương thức để kiểm tra xem nó đúng hay sai. Ví dụ: thuộc tính Boolean 'rỗng', phương thức is của trường này là 'isEmpty ()'.