1. Persistence
-JPA:
- Nhẹ, dựa trên POJO framework Java.
- Giúp để tồn tại các đối tượng Java để các cơ sở dư liệu quan hệ.
- Cung cấp các nhà cung cấp bền bỉ trong việc áp dụng JPA.
- 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ông nghệ ORM mà vẫn tồn tại các thực thể trong cơ sở dữ liệu, hỗ trợ lập bản đồ hướng đối tượng phần mềm để các lược đồ cơ sở dữ liệu thông qua lập bản đồ cấu hình.
- Hình hiển thị bản đồ của Java Objects để Tables.
-Đặc điểm của kỹ thuật của JPA là như sau:
- Hỗ trợ mô hình lập trình POJO cho sự bền bỉ đối tượng vào cơ sở dữ liệu.
- Cung cấp một ORM API tiêu chuẩn trong đó kết hợp các khái niệm hiện tại framework bền vững của bên thứ ba.
- Ví dụ, Hibernate, TopLink, đối tượng Java Data (JDO), và như vậy.
- Định nghĩa một giao diện nhà cung cấp dịch vụ được thực hiện bằng cách kiên trì khác nhau các nhà cung cấp.
-Hình hiển thị các thành phần chính của JPA API.
- Persistence - một bản sắc đó là một giá trị duy nhất được sử dụng bởi các container để map các đối tượng Entity các bản ghi tương ứng trong cơ sở dữ liệu.
- EntityManager - cung cấp các API để tương tác với các Entity.
- EntityManagerFactory - được sử dụng để tạo ra một thể hiện của EntityManager.
- Persistence Unit - bao gồm các thông tin cấu hình XML và một bó của các lớp học được điều khiển bởi các nhà cung cấp JPA.
- Persistence Context - liên quan đến quản lý entity, là một tập hợp các entity như vậy mà đối với bất kỳ persistent, đó là một ví dụ duy nhất về entity.
-Các lớp entity phải được chú thích với các @Entity chú thích được định nghĩa trong javax.persistence package.
- Các lớp phải có một constructor không có đối với sửa đổi lần truy cập công cộng hoặc bảo vệ.
- tính hoặc các phương pháp tổ chức lớp nên không được tuyên bố là cuối cùng. Các lớp học cũng nên không được tuyên bố là cuối cùng
- Nếu ví dụ entity được thông qua dưới dạng Session Bean sau đó nó phải thực hiện các Serializable interface.
- Entity có thể được các lớp Entity hoặc không.
- Các Entity của lớp Entity phải được khai báo là private hay protected và được truy cập chỉ bằng các phương pháp hiện diện trong lớp.
- Mỗi entity phải được xác định bởi một định dạng duy nhất hoặc một khóa chính. Các khóa chính giúp khách hàng truy cập vào các entity.
- Các chú thích @ id áp dụng sở hữu entity xác định rằng sẽ là khóa chính.
-Để quản lý các trường entity trong persistence context, một interface có tên EntityManager API.
- Interface EntityManager được định nghĩa trong javax.persistence package và được sử dụng để tương tác với persistence context.
- Interface EntityManager cung cấp phương pháp để đồng bộ trạng thái của các entity trong cơ sở dữ liệu.
- Hình cho thấy cách làm việc của EntityManager trong JPA.
Bảng liệt kê một số các phương pháp quy định trong EntityManager interface.
Persistence Unit:
- là một tập hợp các lớp map tới một cơ sở dữ liệu cụ thể.
- Được định nghĩa trong một tập tin mô tả đặc biệt có tên persistence.xml.
- Contains hợp lý của các lớp entity, map siêu dữ liệu của họ, và các cấu hình liên quan đến một cơ sở dữ liệu.
- Các chi tiết cấu hình trong persistence.xml được sử dụng trong khi thu thập các ví dụ EntityManager trong chương trình khách hàng.
- Các đoạn mã hiển thị mã cho một tập tin persistence.xml phát triển như là một phần của các ứng dụng doanh nghiệp.
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.
Trong Java Persistence API, một entity có thể có truy cập field-based hoặc property-based. Trong việc tiếp cận field-based, cung cấp persistence truy cập trạng thái của entity trực tiếp thông qua các biến cá thể của nó. Trong truy cập property-based, nhà cung cấp persistence sử dụng JavaBeans kiểu get / phương pháp accessor thiết lập để truy cập tài sản persistent của đơn vị. Tất cả các trường và thuộc tính trong entity đang tồn tại. Tuy nhiên, ghi đè lên một lĩnh vực hoặc property's default persistence bằng cách đánh dấu nó với các @Transient chú thích hoặc từ khóa Java transient.
Các Java Persistence API đơn giản hoá mô hình lập trình cho các thực thể kiên trì và thêm khả năng mà không có trong EJB 2.1. Dưới đây là danh sách những đơn giản hóa và bổ sung của nó:
- 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
- Địa chỉ số kỹ thuật tiêu biểu nhất qua mặc định chú thích
- Cung cấp bản đồ sạch hơn, 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
- Có thể được sử dụng với các nhà cung cấp bền bỉ của bên thứ ba pluggable
2. Serializable
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ớ.
Ấn tượng nhất là 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.
Nếu bạn tò mò để biết: lớp Java chuẩn nào là có thể xếp thứ tự hoặc không, bạn kiểm tra văn kiện cho lớp đó. Việc kiểm tra khá đơn giản: Nếu lớp triển khai java.io.Serializable interface thì nó là Serializable, nếu không thì nó không thể xếp thứ tự.
Tại sao lại cần đến Serialization?
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.
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.
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:
Để 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