Bài viết được sự cho phép của tác giả Giang Phan
Trong bài viết trước, tôi đã hướng dẫn các bạn sử dụng Hibernate Tool tạo các Hibernate Entity một cách tự động từ các table. Trong bài này, tôi sẽ hướng dẫn các bạn cách custom template generate các Entity để sử dụng Lombok cho các getter và setter và tạo các Data Access Object (DAO) class một cách tự động sử dụng Hibernate Tools.
Custom template generate các Hibernate Entity để sử dụng Lombok cho getter và setter
Tạo project và khai báo thư viện cần thiết
Tạo maven project và khai báo các dependency sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
< dependency > < groupId >org.projectlombok</ groupId > < artifactId >lombok</ artifactId > < version >1.18.10</ version > </ dependency > < dependency > < groupId >org.hibernate</ groupId > < artifactId >hibernate-tools</ artifactId > < version >5.4.10.Final</ version > </ dependency > < dependency > < groupId >org.hibernate</ groupId > < artifactId >hibernate-core</ artifactId > < version >5.4.7.Final</ version > </ dependency > <!-- MySQL --> < dependency > < groupId >mysql</ groupId > < artifactId >mysql-connector-java</ artifactId > < version >8.0.17</ version > </ dependency > |
Sử dụng lại database ở bài viết trước: “Hibernate reverse engineering – Customize code generation sử dụng custom strategy class“.
Custom template
Tìm đến thư mục chứa gói jar của thư viện hibernate-tools. Trong ví dụ này, tôi sử dụng hibernate-tools-5.4.10.Final.jar, giải nén thư mục này, chúng ta có thư mục pojo chứa các template cho generate code Entity (POJO):
Hibernate tools sử dụng Freemarker templates để generate Entity (POJO) class. Nội dung các file template này như sau:
- Pojo.ftl : đây là file template chính để generate Entity, nó include các file template khác để tạo thành file Entity.java hoàn chỉnh.
- Ejb3TypeDeclaration.ftl : khai báo các Annotation chẳng hạn @Entity, @Table.
- PojoTypeDeclaration.ftl : khai báo class modifier, class name, extend class hoặc implement interface.
- PojoFields.ftl : khai báo các field tương ứng với table trong dabatable.
- PojoConstructors.ftl : khai báo constructor.
- PojoPropertyAccessors.ftl : khai báo các getter và setter.
- PojoToString.ftl : khai báo override phương thức toString().
- PojoEqualsHashcode.ftl : khai báo override phương thức hashcode() và equals().
- PojoInterfacePropertyAccessors.ftl : khai báo các getter và setter cho interface.
- PojoExtraClassCode.ftl : khai báo các class code khác.
Thư viện Lombok hỗ trợ các Annotation giúp code của POJO class ngắn gọn hơn. Chúng ta sẽ sử dụng Annotation @Data để thay thế cho constructor, getter, setter, toString(), hashcode(), equals() được generate bởi các template mặc định của Hibernate tools.
Mở file Pojo.ftl và bỏ các include không cần dùng, các bạn có thể delete các file tương ứng.
Tiếp theo mở file Ejb3TypeDeclaration.ftl và thêm khai báo @Data của Lombok.
Mặc định, Hibernate sử dụng JPA Annotation ở method, chúng ta muốn chuyển sang field thì cần thực hiện như sau:
- Tạo file template mới Ejb3FieldGetAnnotation.ftl
- Copy toàn nội dung file template Ejb3PropertyGetAnnotation.ftl cho Ejb3FieldGetAnnotation.ftl
- Đổi các variable property sang field.
Mở file PojoFields.ftl và thêm khai báo:
- Thêm static final serialVersionUID field mặc định, để tránh warning cho class Entity.
- Include template file khai báo các JPA Annotation.
Mở file PojoTypeDeclaration.ftl và thêm java doc cho class. Chẳng hạn, thêm @author gpcoder.
Sử dụng Hibernate Tools tạo các Hibernate Entity
Chép thư mục pojo đã custom template ở trên vào thư mục resource của project.
Tại Hibernate Perspective, chọn Hibernate Code Generation Configurations…
Thêm cấu hình mới với các thông tin như sau:
Lưu ý: chỉ chọn thư mục resource, không chọn thư mục pojo. Mặc định hibernate sẽ sử các template của thư mục pojo trong thư mục resource được khai báo.
Chọn tab Exporter và mục Domain code (.java)
Chọn Run, chúng ta có kết quả như sau:
Như bạn thấy, các Annotation Lombok, javadoc đã được include trong file java, các JPA Annotation đã được đánh dấu ở field, không còn các method getter, setter, toString, hashcode, equals hay constructor.
Tạo các Data Access Object (DAO) class
Trong ứng dụng java, chúng ta thường thao tác với database thông qua DAO (Data Access Object) để thực hiện các câu truy vấn dữ liệu. Mỗi bảng nên có một class riêng để thực hiện truy vấn này. Tương tự như Entity, chúng ta có thể tạo ra các class DAO này một cách tự động.
Chẳng hạn, ta có một class GenericDAO như sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package com.gpcoder.dao; import java.util.List; public class GenericDAO<T> { public T findById(Long id) { return null ; } public List<T> findAll() { return null ; } public Long save(T t) { return 1L; } public void update(T t) { } public boolean delete(Long id) { return true ; } } |
Chúng ta mong muốn, mỗi Entity sẽ có một class DAO kế thừa từ class GenericDAO này.
Để làm được điều này, chúng ta thực hiện như sau:
- Tạo file template cho class DAO.
- Sử dụng Hibernate Tools để generate class DAO dựa trên template đã được định nghĩa.
Tạo file template
Tạo file dao-template/dao.ftl trong thư mục resource của project.
Sử dụng Hibernate Tools để generate class DAO
Tại Hibernate Perspective, chọn Hibernate Code Generation Configurations…
Thêm cấu hình mới với các thông tin như sau:
Chúng ta có kết quả như sau: