Friday, February 24, 2017

Persistence and Serializable

Persistence and Serializable


I. Persistence


1. Khái niệm:

- Hiểu 1 cách đơn giản Java Persistence API là một tập của các class và methods để liên tục lưu trữ một lượng lớn dữ liệu vào một cơ sở dữ liệu được cung cấp bởi Oracle.

2. Tại sao nên dùng JPA:
  • 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 linh hoạt 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.
  • Nhẹ, dựa trên POJO framework Java.
  • Chuyển đổi dữ liệu giữa các loại không tương thích trong lập trình hướng đối tượng với các loại cơ sở dữ liệu cơ bản thích hợp.


Các API của Persistence, được định nghĩa trong gói javax.persistence
  • Persistence Unit
  • Persistence Context
  • Java Persistence Query Language


3. Persistence Unit

  • Bao gồm các thông tin về XML configuration và một tập hợp các class mà được điều khiển bởi JPA.
  • Cấu hình Persistence Unit được định nghĩa ra file persistence.xml.
  • Một file persistence.xml có thể chứa 1 hoặc nhiều các configration persistence unit được đặt tên.
  • 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ý.
  • 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.
  • Có thể có các nhà cung cấp persistence khác nhau cho các persistence unit khác nhau.


Đoạn mã sau đây cho thấy một mẫu persistence.xml tập tin định nghĩa các thuộc tính JDBC:


<persistence-unit name="JPAProject" 
      transaction-type="RESOURCE_LOCAL"> 
  <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
  <!--Entity Classes --> 
  <class>com.infosys.demo.Item</class> 
  <class>com.infosys.demo.Employee</class> 
  <properties> 
 <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/JPA 2" /> 
    <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
    <property name="javax.persistence.jdbc.user" value="root" /> 
 <property name="javax.persistence.jdbc.password" value="infosys"/> 
 <property name="javax.persistence.jdbc.show_sql" value="true" /> 
   </properties> 
</persistence-unit>


Một số thuộc tính được định nghĩa trong 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.


4. Persistence Context

  • Kết hợp với manager entity, là một tập hợp các entity cho bất kỳ persistent identity
  • Để quản lí các entity với persistence context, 1 interface EntityManager API được sử dụng.
  • Một file persistence.xml có thể chứa 1 hoặc nhiều các configration persistence unit được đặt tên.
  • Interface EntityManager được định nghĩa trong package javax.persistence và được dùng để tương tác với persistence context.


                                                      Concept của EntityManager.

javax.persistence.EntityManagerFactory :

protected void setUp() throws Exception {
    entityManagerFactory = Persistence.createEntityManagerFactory( "org.hibernate.tutorial.jpa" );
}


Interface EntityManager cung cấp các method để đồng bộ state của entity instance đến database:



Các chức năng mở rông của Persistence Property, được phân loại theo chức năng:
  • Weaving
  • Customizers
  • Validation and Optimization
  • Caching
  • Mapping
  • Schema generation
  • JDBC configuration


5. Java Persistence Query Language

  • Giúp truy vấn đối với các object được lưu trữ trong 1 db.
  • Được nâng cấp mở rộng từ EJB QL (Enterprise JavaBean Query Language), loại bỏ nhiều điểm yếu của các phiên bản trước
  • Truy vấn giống SQL trong cú pháp, nhưng không phải là hoạt động trực tiếp với các bảng cơ sở dữ liệu.


6. Đánh giá về Persistence

  • Yêu cầu các lớp và các giao diện ít
  • Hầu như loại bỏ mô tả triển khai kéo dài qua các chú thích
  • Mapping dễ dàng hơn, tiêu chuẩn đối tượng quan hệ
  • Loại bỏ sự cần thiết cho mã tra cứu
  • Thêm hỗ trợ cho các thừa kế, đa hình, và các truy vấn đa hình.
  • Thêm hỗ trợ cho tên (tĩnh) và truy vấn động.
  • Cung cấp một ngôn ngữ truy vấn Java Persistence - một nâng cao EJB QL
  • Làm cho nó dễ dàng hơn để kiểm tra các đơn vị bên ngoài của EJB container
  • Có thể được sử dụng bên ngoài của container


II. Serialization



- Serialize có nghĩa là sắp theo thứ tự. Khi ta muốn lưu một đối tượng xuống tập tin trên đĩa để lưu trữ, ta phải định ra trình tự lưu trữ của dữ liệu trong đối tượng. Khi cần tái tạo lại đối tượng từ thông tin trên tập tin đã lưu trữ, ta sẽ nạp đúng theo trình tự đã định trước đó. Đây được gọi là quá trình Serialize.

- Nói chính xác hơn, Serialize là tiến trình biến đổi trạng thái của đối tượng theo một định dạng có thể được lưu trữ hay dịch chuyển.

- Để serializable, 1 class phải implement Serializable interface.



- Class ObjectInputStream và ObjectOutputStream là dòng cao cấp có chứa các phương pháp serializing và deserializing một đối tượng.



Chúng ta làm 1 ví dụ nhé


Run và cảm nhận!


Làm thế nào để Serialize một object?

Để Serialize một object ta cần đảm bảo rằng class của object đó cài đặt giao diện java.io.Serializable. Đây là một giao diện trống, ko có method nào cần cài đặt cả.

Thông thường thuật toán Serialization sẽ thực hiện các công việc sau:

  • Ghi xuống các siêu dữ liệu (metadata) về class (ví dụ như tên của class, version của class, tổng số các field của class,….) , của đối tượng đó.

  • Ghi đệ quy các thông tin chi tiết của các lớp cha cho tới khi nó gặp class Object.

  • Sau khi hoàn tất việc ghi các siêu dữ liệu, tiến trình sẽ bắt đầu ghi các dữ liệu thật sự của các đối tượng

Tài liệu tham khảo



https://docs.oracle.com/javaee/6/tutorial/doc/bnbpz.html

No comments:

Post a Comment