JPA là gì?
Back To Blogs1. JPA là gì
- JPA là viết tắt của Java Persistence API (sau này đổi tên thành Jakarta Persistence API)
- Nó cung cấp một framework cho các nhà phát triển để quản lý dữ liệu liên quan đến cơ sở dữ liệu một cách hiệu quả và trực quan. JPA định nghĩa các đối tượng Java (entities) được lưu trữ, truy xuất, cập nhật, xoá trong cơ sở dữ liệu.
- JPA là một đặc tả Java cho việc ánh xạ giữa các đối tượng Java với cơ sở dữ liệu quan hệ sử dụng công nghệ phổ biến là ORM (Object Relational Mapping).
2. ORM là gì
- ORM (Object-Relational Mapping) là một kỹ thuật trong lập trình để ánh xạ các đối tượng Java vào cơ sở dữ liệu quan hệ. Khi sử dụng ORM, chúng ta có thể làm việc với cơ sở dữ liệu thông qua các đối tượng Java, thay vì phải sử dụng các câu truy vấn SQL trực tiếp.
- Một framework như Hibernate ORM sẽ thực thi quá trình đó bên trong 1 thư viện, framework , hoặc 1 layer như một phần trong cấu trúc của chương trình, lớp ORM có vai trò quản lý sự chuyển đổi qua lại giữa các đối tượng (objects) với các bảng (tables) và cột (colums) trong cơ sở dữ liệu quan hệ (relational database). Trong Java, lớp ORM biến đổi các lớp (class) và đối tượng (object) Java để chúng có thể được lưu trữ và quản lý trong cơ sở dữ liệu.
3. Cấu tạo JPA
JPA sử dụng metadata để ánh xạ các đối tượng persistence với các bảng trong cơ sở dữ liệu. JPA hỗ trợ SQL như là một ngôn ngữ truy vấn để dễ dàng xử lý các truy vấn cơ sở dữ liệu. Ngôn ngữ truy vấn JPA có thể dùng thực thi cả truy vấn tĩnh và truy vấn động.
JPA bao gồm ba thành phần chính là: Entity, Entity Manager, và Entity Manager Factory. Ngoài ra còn có, EntityTransaction, Persistence, Query.
Entity
- Entity là các đối tượng thể hiện tương ứng 1 table trong cơ sở dữ liệu. Entity thường là các class POJO đơn giản, chỉ gồm các phương thức getter, setter.
@Entity @Table(name = "employees") public class Employee { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column(name = "name", nullable = false) private String name; @Column(name = "salary", nullable = false) private double salary; @Column(name = "workingdays", nullable = false) private double workingdays;
Entity Manager
- Entity Manager là một interface cung cấp các API cho việc tương tác với các Entity.
- Được dùng để tạo ra một instance của EntityManager.
- Một Transaction là một tập hợp các thao tác trong đó tất cả các thao tác phải được thực hiện thành công hoặc tất cả thất bại.
- Một database transaction bao gồm một tập hợp các câu lệnh SQL được committed hoặc rolled back trong một unit.
- Entity Transaction có quan hệ 1-1 với EntityManager. Bất kỳ thao tác nào được bắt đầu thông qua đối tượng Entity Manager đều được đặt trong một Transaction. Đối tượng Entity Manager giúp tạo Entity Transaction.
public void updateEmployee(int id, String name, double salary, double workingDays, double receipt, double payment) { try { executeTransaction(session -> { Employee employee = session.get(Employee.class, id); if (employee != null) { employee.setName(name); employee.setSalary(salary); employee.setWorkingdays(workingDays); employee.setReceipt(receipt); employee.setPayment(payment); session.update(employee); } else { System.out.println("Employee not found with ID: " + id); } }); } catch (Exception e) { System.err.println("Error updating employee with ID: " + id); e.printStackTrace(); } }
Persistence
- Một Persistence định nghĩa một tập hợp các Entity class được quản lý bởi 1 instacne của EntityManager trong ứng dụng.
- Đây là một interface, được mỗi nhà cung cấp JPA implement để có được các đối tượng quan hệ đáp ứng các tiêu chí (criteria) truy vấn.
4. Cài đặt và thiết lập JPA
- Thêm dependency vào file pom.xml
<dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.6.14.Final</version> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.4.0</version> </dependency> <dependency> <groupId>javax.persistence</groupId> <artifactId>javax.persistence-api</artifactId> <version>2.2</version> </dependency> </dependencies>
- Cấu hình liên kết database trong file persisence.xml hoặc cấu hình Java (Annotation-based configuration) ở đây dùng cấu hình java
private static final SessionFactory sessionFactory; static { try { Configuration configuration = new Configuration(); configuration.setProperty("hibernate.connection.driver_class", "com.mysql.cj.jdbc.Driver"); configuration.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/accounting_system"); configuration.setProperty("hibernate.connection.username", "root"); configuration.setProperty("hibernate.connection.password", "123456"); configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect"); configuration.setProperty("hibernate.hbm2ddl.auto", "update"); configuration.setProperty("hibernate.show_sql", "true"); configuration.setProperty("hibernate.format_sql", "true"); configuration.addAnnotatedClass(Employee.class); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() .applySettings(configuration.getProperties()) .build(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); } catch (Throwable ex) { throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; }