1. Khái niệm:
- Java Persistence API hay JPA là một đăc tả Java cho việc ánh xạ giữa các đối tượng Java tới cơ sở dữ liệu quan hệ sử dụng cộng nghệ phổ biến là ORM (Object Relational Mapping). JPA API cung cấp đầy đủ các công cụ cho phép người lập trình có thể tạo cơ sở dữ liệu một cách đơn giản và nhanh chóng. JPA API có thể dùng để persist một đối tượng business (POJO) vào trong cơ sở dữ liệu hoặc lấy dữ liệu từ cơ sở dữ liệu và ánh xạ ra các đối tượng business một cách đơn giản.
- Ngày nay đa số các nhà cung cấp đều hỗ trợ cài đặt JPA cho framework persistence của họ. Vì vây, người lập trình có thể lựa chọn nhà cung cấp tốt nhất tùy thuộc yêu cầu ứng dụng của mình.
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 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.
3. Có 3 thành phần chính:
* Entity:
- Là một Persistence Object – một POJO được có khả năng Persist đến Database.
- Mô hình Entity là 1 – 1 theo nghĩa 1 Entity Class là một Table dưới Database và 1 Entity Instance là một hàng dữ liệu dưới Database.
- Các Instance được tạo bằng từ khóa new từ các Entity Class. Tuy nhiên, nó chỉ được đồng bộ xuống Database khi các Instance này được các EntityManager quản lý.
- Các thuộc tính trong Entity phải được truy cập thông qua các hàm get và set – bắt buộc được xây dựng trong Entity Class.
- Một số yêu cầu khi cài đặt Entity Class:
+ Phải implements serializable.
+ Phải sử dụng @Entity.
+ Phải có một Constructor không tham số.
+ Class và các phương thức không được khai báo là final.
+ Các thuộc tính phải được khai báo khác như public và phải có đầy đủ get và set để truy cập.
+ Phải có một thuộc tính làm khóa chính với annotation @Id.
* EntityManager:
- Làm nhiệm vụ để quản lý việc đồng bộ dữ liệu từ Entity Instance xuống Database và lấy dữ liệu từ Database đưa vào các Instance thông qua các Query.
- Mô hình tổng quát của EntityManager:
- Một EntityManager Instance cho phép kết nối từ bên ngoài vào Databse ở Client hay kết nối đến Database cục bộ khi ở ngay trong Server.
- Một số phương thức của EntityManager hỗ trợ trong quá trình xây dựng ứng dụng:
+ public void persist (Object entity): Lưu trữ Entity vào Database (Insert) và đưa Entity Instance vào Persistence Context.
+ public <T> T merge (T entity): Đưa một Entity đã được quản lý từ bên ngoài Persistence Context vào lại bên trong.
+ public void remove (Object entity): Xóa một dòng dữ liệu dưới Database và đưa Entity ra khỏi Persistence Context và yêu cầu Container hủy nó đi.
+ find (Entity class, Primary Key): Tìm kiếm một Entity Instance từ bộ nhớ hay Database (đem từ Database đổ vào Instance) và đưa Entity Instance này vào Persistence Context.
* EntityManager Factory: Là đối tượng dùng để tạo ra Instance của EntityManager.
4. Tính năng:
- 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.
II. Serializable:
- 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.
- Lớp Serializable giúp Java quản lí và ràng buộc được các đối tượng cả khi đọc và khi ghi xuống tập tin. Việc đọc và ghi các đối tượng ko phải lúc nào cũng đơn giản, có rất nhiều đối tượng bên trong bao gồm nhiều đối tượng khác. Nhưng một khi đã cài đặt giao diện Serializable. Java sẽ chịu trách nhiệm dò tìm bất cứ đối tượng nào liên quan để “túm lấy” và đẩy xuống tập tin cùng với đối tượng. Đồng thời, quá trình đọc lên cũng sẽ đảm bảo khôi phục đầy đủ các đối tượng liên quan.
- Làm thế nào để Serialize một object? Ta cần đảm bảo rằng lớp Class của Object đó cài đặt giao diện java.io.Serializable. Đây là một giao diện trống, không 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ề lớp 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.
+ Đối với các lớp cần Serialize, chúng ta phải cho lớp đó implements interface java.io.Serializable.
+ Tạo 1 lớp chuyên dùng cho việc serialize đối tượng với 2 phương thức SerializeObject và DeserializeObject.
Như vậy, với lớp này chúng ta có thể dùng nó cho các lần Serialize bất kỳ đối tượng nào xuống file.
III. JPA Configuration:
- Persistence Unit:
+ Là một tập hợp các lớp ánh xạ 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.
+ Có nhóm hợp lý của các lớp thực thể, ánh xạ metadata của chúng, 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 EntityManager Instance trong chương trình trên Client.
+ Các EntityManager Instance phù hợp tiếp diễn các Entity Instance trong Database.
- Đoạn code hiển thị các mã cho một tập tin persistence.xml phát triển như là một phần của ứng dụng doanh nghiệp.
- Một số thuộc tính xác định trong yếu tố <persistence-unit> như sau:
+ <description>: Mô tả các đơn vị bền vững và được tùy chọn.
+ <provider>: Phải hiển thị trong môi trường J2SE hoặc khi các ứng dụng đòi hỏi một hành vi cung cấp cụ thể.
+ <transaction-type>: Thường có giá trị là JTA, RESOURCE_LOCAL.
+ <jta-data-source>/<non-jta-data-source>: Dùng để chỉ định đặt tên Java và tên thư mục Interface (JNDI) của nguồn dữ liệu. JNDI được sử dụng bởi các cung cấp bền bỉ.
+ <mapping-file>: Chứa một danh sách của một hay nhiều tập tin XML được sử dụng để ánh xạ O/R. Các tập tin ánh xạ được sử dụng để liệt kê các lớp Entity mà có sẵn trong đơn vị bền vững.
+ <properties>: Chỉ ra các thuộc tính cấu hình mà là cung cấp cụ thể cho các đơn vị bền vững. Bất kỳ thuộc tính nào không được công nhận bởi các cung cấp bền vững đã được loại bỏ.