Cơ Bản Về JPA - Hướng Dẫn Java
Có thể bạn quan tâm
Trong bài viết này, như bài viết giới thiệu về Hibernate, không dài dòng, mình sẽ đi thẳng vào một ví dụ về JPA với implementation của Hibernate để các bạn có cái nhìn đầu tiên và hiểu cách mà JPA làm việc luôn các bạn nhé!
Đầu tiên, mình sẽ tạo một Maven project như sau:

Vì mình sẽ sử dụng JPA với implementation của Hibernate, do đó, mình sẽ thêm Hibernate dependencies như sau:
XHTML <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.2.12.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>5.2.12.Final</version> </dependency>| 12345678910 | <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.2.12.Final</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>5.2.12.Final</version></dependency> |
Mình cũng sẽ sử dụng MySQL database nên mình cũng sẽ thêm MySQL Driver dependency như sau:
XHTML <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.6</version> </dependency>| 12345 | <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>6.0.6</version></dependency> |
Project Lombok:
XHTML <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> <scope>provided</scope> </dependency>| 123456 | <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.18</version><scope>provided</scope></dependency> |
Trong ví dụ này, mình sẽ định nghĩa một database chứa thông tin của lớp học và những sinh viên của lớp học đó như sau:
MySQL CREATE TABLE `clazz` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;| 12345 | CREATETABLE`clazz`(`id`int(11)NOT NULLAUTO_INCREMENT,`name`varchar(45)NOT NULL,PRIMARY KEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8; |
| 1234567891011 | CREATETABLE`students`(`id`int(11)NOT NULLAUTO_INCREMENT,`name`varchar(45)NOT NULL,`code`varchar(10)NOT NULL,`date_of_birth`datetimeDEFAULTNULL,`email`varchar(100)DEFAULTNULL,`clazz_id`int(11)NOT NULL,PRIMARY KEY(`id`),KEY`student_clazz_idx`(`clazz_id`),CONSTRAINT`student_clazz`FOREIGN KEY(`clazz_id`)REFERENCES`clazz`(`id`)ON DELETENOACTIONON UPDATENOACTION)ENGINE=InnoDBDEFAULTCHARSET=utf8; |
Các bước chuẩn bị đã xong, giờ chúng ta bắt đầu đi vào phần chính nhé các bạn.
Đầu tiên, để có thể thao tác với các bảng clazz và students trong database, chúng ta sẽ ánh xạ các bảng, các cột của những table này qua thành những Java object trước (ORM).
Java package com.huongdanjava.jpa; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import lombok.Getter; import lombok.Setter; @Entity @Table @Getter @Setter public class Clazz { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column private String name; }| 12345678910111213141516171819202122232425 | packagecom.huongdanjava.jpa; importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjavax.persistence.Table; importlombok.Getter;importlombok.Setter; @Entity@Table@Getter@SetterpublicclassClazz{ @Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateLongid; @ColumnprivateStringname;} |
| 123456789101112131415161718192021222324252627282930313233343536373839 | packagecom.huongdanjava.jpa; importjava.util.Date; importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjavax.persistence.Table; importlombok.Getter;importlombok.Setter; @Entity@Table@Getter@SetterpublicclassStudents{ @Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateLongid; @ColumnprivateStringname; @ColumnprivateStringcode; @Column(name="date_of_birth")privateDate dateOfBirth; @ColumnprivateStringemail; @Column(name="clazz_id")privateLongclazzId;} |
Tiếp theo chúng ta sẽ là tạo một tập tin cấu hình để làm việc với JPA.
Tập tin cấu hình này sẽ chứa thông tin của một hay nhiều persistence unit. Một persistence unit là một tập hợp chứa thông tin những Java object ánh xạ đến các cột các bảng trong database và thông tin về kết nối tới database, username, password. Ngoài ra, nó còn chứa một số thông tin cấu hình khác nữa.
XHTML <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence_2_1.xsd"> <persistence-unit name="jpaexample" transaction-type="RESOURCE_LOCAL"> <class>com.huongdanjava.jpa.Clazz</class> <class>com.huongdanjava.jpa.Students</class> <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpa_example" /> <property name="javax.persistence.jdbc.user" value="root" /> <property name="javax.persistence.jdbc.password" value="123456" /> <property name="hibernate.format_sql" value="true" /> <property name="hibernate.use_sql_comments" value="true" /> </properties> </persistence-unit> </persistence>| 1234567891011121314151617181920 | <persistence version="2.1"xmlns="http://xmlns.jcp.org/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence_2_1.xsd"> <persistence-unit name="jpaexample"transaction-type="RESOURCE_LOCAL"><class>com.huongdanjava.jpa.Clazz</class><class>com.huongdanjava.jpa.Students</class><exclude-unlisted-classes>true</exclude-unlisted-classes> <properties><property name="javax.persistence.jdbc.driver"value="com.mysql.jdbc.Driver" /><property name="javax.persistence.jdbc.url"value="jdbc:mysql://localhost:3306/jpa_example" /><property name="javax.persistence.jdbc.user"value="root" /><property name="javax.persistence.jdbc.password"value="123456" /> <property name="hibernate.format_sql"value="true" /><property name="hibernate.use_sql_comments"value="true" /></properties></persistence-unit></persistence> |
Mình sẽ giải thích chi tiết những cấu hình này trong bài viết sau nhé các bạn.
Thông thường chúng ta đặt tên cho tập tin cấu hình này là persistence.xml và tập tin này sẽ được chứa trong thư mục /src/main/resources/META-INF của project.

OK, chúng ta đã cấu hình xong, vậy giờ làm thế nào để sử dụng những thông tin cấu hình đó.
Chúng ta sẽ dùng đối tượng Persistence của JPA để đọc những thông tin cấu hình đó lên và dùng đối tượng EntityManagerFactory để chứa chúng.
Java EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpaexample");| 1 | EntityManagerFactory emf=Persistence.createEntityManagerFactory("jpaexample"); |
Các bạn để ý là jpaexample chính là tên của persistence unit mà chúng ta đã khai báo trong tập tin cấu hình.
Và giờ chúng ta có thể sử dụng đối tượng EntityManagerFactory để làm việc rồi.
Để làm việc với JPA, chúng ta sẽ lấy một đối tượng EntityManager từ EntityManagerFactory.
Java EntityManager em = emf.createEntityManager();| 1 | EntityManager em=emf.createEntityManager(); |
Nếu các bạn cần thao tác có liên quan đến cập nhập database, chúng ta cần mở một transaction mới. Nếu không thì không cần mở transaction nhé các bạn. Ở đây, mình cần thêm mới một class, do đó mình sẽ mở một transaction như sau:
Java EntityTransaction transaction = em.getTransaction(); transaction.begin();| 12 | EntityTransaction transaction=em.getTransaction();transaction.begin(); |
Ở đây, chúng ta sẽ thêm mới một record trong bảng clazz nên chúng ta sẽ khởi tạo mới đối tượng Clazz:
Java Clazz clazz = new Clazz(); clazz.setName("Class A");| 12 | Clazz clazz=newClazz();clazz.setName("Class A"); |
và dùng đối tượng EntityManager để lưu đối tượng Clazz này vào database:
Java em.persist(clazz); transaction.commit();| 12 | em.persist(clazz);transaction.commit(); |
Toàn bộ code như sau:
Java package com.huongdanjava.jpa; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; public class Application { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpaexample"); EntityManager em = emf.createEntityManager(); EntityTransaction transaction = em.getTransaction(); transaction.begin(); Clazz clazz = new Clazz(); clazz.setName("Class A"); em.persist(clazz); transaction.commit(); } }| 1234567891011121314151617181920212223 | packagecom.huongdanjava.jpa; importjavax.persistence.EntityManager;importjavax.persistence.EntityManagerFactory;importjavax.persistence.EntityTransaction;importjavax.persistence.Persistence; publicclassApplication{ publicstaticvoidmain(String[]args){EntityManagerFactory emf=Persistence.createEntityManagerFactory("jpaexample");EntityManager em=emf.createEntityManager(); EntityTransaction transaction=em.getTransaction();transaction.begin(); Clazz clazz=newClazz();clazz.setName("Class A");em.persist(clazz); transaction.commit();}} |
Kết quả:
Từ khóa » Tìm Hiểu Về Jpa
-
Tổng Quan Về JPA (Java Persistence API) - GP Coder (Lập Trình Java)
-
Tổng Quan Về JPA - Techmaster
-
Giới Thiệu Về Spring JPA - Techmaster
-
Dùng Hibernate đã Lâu? Thế Bạn Có Biết JPA Là Gì? - Viblo
-
Giới Thiệu Về Kiến Trúc JPA - HelpEx
-
Giới Thiệu Về Spring Data JPA - Tại Sao Cần Sử Dụng Nó?
-
Spring Data JPA Là Gì? Tại Sao Chúng Ta Cần Sử Dụng Nó? - Deft Blog
-
JPA Là Gì? Sự Khác Nhau Giữa JPA Với Hibernate - STACKJAVA
-
Tổng Quan Về JPA (Java Persistence API) - Chickgolden
-
Bài 5: Giới Thiệu Về Lập Trình JPA (Java Persistence API) Cơ Bản
-
Spring Data Jpa Là Gì
-
Jpa Là Gì
-
[SB11] Hướng Dẫn Spring Boot JPA + MySQL
-
Sử Dụng Spring Data Jpa Là Gì ? Giới Thiệu Về Spring Jpa