Thứ Bảy, 29 tháng 10, 2016

JPA Configuration, Persistence API and Serializable

I. JAVA PERSISTENCE API

1. Khái niệm:

- Java Persistence Architect API (JPA) là một kỹ thuật của Java dùng để truy xuất, quản lý và duy trì dữ liệu giữa các đối tượng/các lớp của Java và CSDL. JPA được định nghĩa như một phần trong đặc tả kỹ thuật của EJB 3.0.JPA được xem như là cách tiếp tiêu chuẩn cho các mô hình quan hệ đối tượng (Object to Relational Mapping – ORM) trong Java.

- Bản thân JPA chỉ là một đặc điểm kỹ thuật chứ không phải là một sản phẩm. Do đó JPA tự mình không thể thực thi các thao tác liên quan đến CSDL. JPA là tập hợp nhiều interface nên cần phải có các class triển khai, các class này được triển khai từ CSDL. Chính vì vậy JPA luôn đòi hỏi phải có một CSDL để ánh xạ tạo ra các class.

2. Thành phần trong JPA:

- Persistence: 
+  Giá trị duy nhất được sử dụng bởi các container để map đối tượng entity tới các bản ghi tương ứng. Bạn có thể lưu các dữ liệu trong một tập tin mã hóa và giải mã thuật toán riêng của bạn.


- EntityManager:  

+ EntityManager là một giao diện (interface) cung cấp các API cho việc tương tác với các Entity. 

Một số chức năng cơ bản của EntityManager như: 

Persist: phương thức này dùng để lưu một thực thể mới tạo vào cơ sở dữ liệu

Merge: dùng để cập nhật trạng thái của entity vào cơ sở dữ liệu.

Remove: xóa một thể hiện của entity.

- Persistence Unit: 

+ Mỗi Persistence Unit định nghĩa 1 hoặc nhiều thực thể quản lý mà các EntityManager của 1 ứng dụng có thể quản lý.

+ Cấu hình Persistence Unit được định nghĩa ra file persistence.xml.

Mỗi Persistence Unit cung cấp 1 tập hợp các thuộc tính cho việc cấu hình Data Source. Cùng với tất cả các chi tiết kết nối cần thiết, các Persistence Unit cũng chỉ rõ các nhà cung cấp JPA.


- Persistence Context:

Một Persistence Context là một tập hợp các Entity được quản lý bởi EntityManager . Persistence Context đánh dấu sự thay đổi của các Entity đó. Entity Manager hỗ trợ Persistence Context để commit hoặc undo những thay đổi. Ngay khi một EntityManager Object được tạo ra ,  nó ngầm được liên kết với một Persistence Context để phục vụ cho việc quản lý tập các Entity. 

Một Persistence Context sẽ được định nghĩa một giới hạn mà ở đó các đối tượng Entity sẽ được tạo ra, lưu trữ hoặc hủy bỏ.

                          Mối quan hệ giữa Persistence Contex và Persistence Unit


- Một số thuộc tính được định nghĩa trong  <persistence-unit>yếu tố như sau:

 <description>: mô tả các persistence unit và là tùy chọn.

 <provider>: phải có mặt trong môi trường J2SE hoặc khi các ứng dụng yêu cầu một hành động dịch vụ cụ thể.

<transaction-type>:  có giá trị hoặc như Java Transaction API (JTA) hoặc RESOURCE_LOCAL hoặc theo mặc định, giá trị là JTA.

 <JTA-data-source> / <không JTA-data-source>: dùng để chỉ định Java Naming và Directory Interface (JNDI) của nguồn dữ liệu. JNDI được sử dụng bởi các persistence

<mapping-file>: có chứa một danh sách của một hay nhiều file XML được sử dụng để mapping O/R. Các tập tin map được sử dụng để liệt kê các lớp entity mà có sẵn trong persistence unit

<properties>: quy định các thuộc tính cấu hình mà là nhà cung cấp cụ thể cho các persistence unit. Bất kỳ thuộc tính không được công nhận bằng cách các persistence provider đã được bỏ qua.


3. Tính năng, vai trò của JPA:

- Các tính năng JPA:

+ JPA hỗ trợ pluggable, tức là có thể sử dụng nhiều nhà hãng cung cấp thứ ba như Hibernate hay Toplink.

+ Hỗ trợ annotation Giảm bớt số lớp yêu cầu cho việc phát triển persistence.

Không cần phải viết các mô tả triển khai trong xml. Annotation dựa trên metadata đã hỗ trợ trong các ứng dụng JPA. 

+ Đã chuẩn hóa ORM và dễ dàng phát triển hơn JPA hỗ trợ truy vấn động và tĩnh.

+ Nhiều IDE hỗ trợ phát triển ứng dụng JPA và có thể tự động sinh code ánh xạ từ cơ sở dữ liệu thành các entity và ngược lại.

- Vai trò và lợi ích đem lại của JPA:

+ Việc giới thiệu JPA vào trong đặc tả J2EE 5 là một bước tiến lớn trong việc đơn giản hóa các quy trình phát triển ứng dụng. JPA đơn giản hóa mô hình thực thể dữ liệu và cộng thểm một số tính năng mới mà phiên bản EJB trước (EJB 2.0) không có. Giờ đây người lập trình có thể ánh xạ trực tiếp các đối tượng persistence với cơ sở dữ liệu quan hệ. JPA có thể sử dụng bên ngoài container, điều này không dễ thực hiện trong EJB 2.1. Bạn cũng có thể sử dụng JPA trong các ứng dụng swing.

+ JPA là một đặc tả đã được chuẩn hóa và là một thành phần trong đặc tả EJB 3.

+ Có nhiều framework ORM miễn phí hỗ trợ có thể dùng để phát triển nhiều loại ứng dụng khác nhau. 

+ Ứng dụng xây dựng trên JPA mang tính di động cao.

+ Có thể sử dụng cho cả ứng dụng J2EE và J2SE.

+ Hỗ trợ cầu hình triển khai bằng annotation và xml.

+ Độc lập về DB,không phải làm việc với SQL.



II.Serializable

1.Khái niệm
Java cung cấp một kỹ thuật, được gọi là serialization, tại đây một đối tượng có thể được biểu diễn như là một dãy byte liên tục mà bao gồm dữ liệu của đối tượng cũng như thông tin về kiểu đối tượng và kiểu dữ liệu được lưu giữ trong đối tượng.
- Sau khi một đối tượng được serialize đã được ghi vào trong một file, nó có thể được đọc từ file này và được deserialize từ đó, đó là thông tin kiểu và các byte mà biểu diễn đối tượng và dữ liệu của nó có thể được sử dụng để tái tạo đối tượng này trong bộ nhớ.
- Toàn bộ tiến trình là JVM độc lập, nghĩa là một đối tượng có thể được xếp thứ tự (serialize) trên một platform và deserialize trên một platform hoàn toàn khác.
Các lớp ObjectInputStream và ObjectOutputStream trong Java là các luồng bậc cao mà chứa các phương thức để serialize và deserialize một đối tượng.
Lớp ObjectOutputStream chứa nhiều phương thức write để ghi các kiểu dữ liệu đa dạng, nhưng với một phương thức trong đầu ra chuẩn cụ thể:
public final void writeObject(Object x) throws IOException
- Phương thức trên xếp thứ tự một Object theo thứ tự và gửi nó tới đầu ra chuẩn. Tương tự, lớp ObjectInputStream chứa phương thức sau để deserialize một đối tượng:
public final Object readObject() throws IOException, 
                                 ClassNotFoundException
- Phương thức này thu nhận Object tiếp theo ra khỏi luồng và deserialize nó. Giá trị trả về là Object, vì thế bạn sẽ cần ép nó thành kiểu dữ liệu thích hợp.
- Để minh họa cách serialization làm việc trong Java, tôi sử dụng lớp Employee mà đã bàn luận trong các chương trước. Giả sử rằng chúng ta có lớp Employee sau, mà triển khai Serializable Interface:
public class Employee implements java.io.Serializable
{
   public String name;
   public String address;
   public transient int SSN;
   public int number;
   public void mailCheck()
   {
      System.out.println("Gui mail toi " + name
                           + " " + address);
   }
}
- Ghi chú rằng, với một lớp để được xếp thứ tự theo thứ tự một cách thành công, phải có hai điều kiện sau:
 + Lớp phải triển khai java.io.Serializable interface
 + Tất cả các trường trong lớp phải là có thể xếp thứ tự (Serializable). Nếu một trường là không thể xếp thứ tự, nó phải được đánh dấu.
- Lớp ObjectOutputStream được sử dụng để xếp thứ tự một Object. Chương trình SerializeDemo sau khởi tạo một đối tượng Employee và xếp thứ tự nó vào trong một file.
- Khi chương trình thực thi, một file với tên employee.ser được tạo. Chương trình không tạo bất kỳ đầu ra nào, nhưng bạn xem xét code và cố gắng xác định xem chương trình đang làm cái gì.
Chú ý: Khi xếp thứ tự một đối tượng vào một file, qui ước chuẩn trong Java là cung cấp một file có đuôi là .ser .
import java.io.*;

public class SerializeDemo
{
   public static void main(String [] args)
   {
      Employee e = new Employee();
      e.name = "Reyan Ali";
      e.address = "Phokka Kuan, Ambehta Peer";
      e.SSN = 11122333;
      e.number = 101;
      try
      {
         FileOutputStream fileOut =
         new FileOutputStream("/tmp/employee.ser");
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(e);
         out.close();
         fileOut.close();
         System.out.printf("Du lieu da duoc serialize duoc luu giu trong /tmp/employee.ser");
      }catch(IOException i)
      {
          i.printStackTrace();
      }
   }
}

* Deserialize một Object trong Java

Chương trình DeserializeDemo sau sẽ deserialize đối tượng Employee được tạo trong chương trình SerializeDemo. Bạn xem xét chương trình này và xác định đầu ra của nó:
import java.io.*;
public class DeserializeDemo
{
   public static void main(String [] args)
   {
      Employee e = null;
      try
      {
         FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
         ObjectInputStream in = new ObjectInputStream(fileIn);
         e = (Employee) in.readObject();
         in.close();
         fileIn.close();
      }catch(IOException i)
      {
         i.printStackTrace();
         return;
      }catch(ClassNotFoundException c)
      {
         System.out.println("Khong tim thay lop Employee");
         c.printStackTrace();
         return;
      }
      System.out.println("Deserialized Employee...");
      System.out.println("Name: " + e.name);
      System.out.println("Address: " + e.address);
      System.out.println("SSN: " + e.SSN);
      System.out.println("Number: " + e.number);
    }
}

2.Vai trò

Một hệ thống Enterprise điển hình thường có các thành phần nằm phân tán rải rác trên các hệ thống và mạng khác nhau. Trong Java mọi thứ đều được miêu tả như là một object. Nếu 2 thành phần Java cần liên lạc với nhau, ta cần phải có một cơ chế để chúng trao đổi dữ liệu. Serialization được định nghĩa cho mục đích này, và các thành phần Java sẽ sử dụng giao thức (protocol) này để truyền các object qua lại với nhau.

Không có nhận xét nào:

Đăng nhận xét