Hibernate reverse engineering – Customize code generation sử dụng custom strategy class

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 đã giới thiệu với các bạn sử dụng tính năng Reverse Engineering của Hibernate Tool để Generate code domain model classes, annotated EJB3 entity, Hibernate mapping files một cách tự động. Có một số trường hợp, chúng ta cần customize code generation chẳng hạn database được thiết kế có prefix “gp_” cho tất cả table. Tuy nhiên, trong code chúng ta không muốn có prefix này, ví dụ gp_user thì cần generate class là User. Để giải quyết vấn đề này, ta có thể tạo một Custom Strategy Class để tùy chỉnh việc tạo các tên class được generate.

  Hibernate Criteria Query Language (HCQL)
  Hibernate Batch processing

Giới thiệu ReverseEngineeringStrategy

Bên cạnh việc sử dụng XML trong file hibernate.reveng.xml, chúng cũng có thể tùy chỉnh việc generate bằng mã Java. Điều này có thể được thực hiện bằng cách tạo một lớp Java implements ReverseEngineeringStrategy hoặc extends DelegatingReverseEngineeringStrargetyclass. Cả hai đều nằm trong package org.hibernate.cfg.reveng.

Có rất nhiều phương thức hỗ trợ chúng ta custom việc generate code:

Một số phương thức thường được sử dụng:

  • excludeTable() : xác định có cần generate table này hay không.
  • excludeColumn() : xác định có exclude column khỏi class được generate hay không.
  • tableToClassName()  : xác định table name sang class name.
  • columnToPropertyName() : xác định tên column sang tên property.

Khởi tạo project

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
<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>

Tạo database gp_hibernate_demo2 có 2 bảng như sau:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE TABLE `gp_user` (
  `id` bigint(20) NOT NULL,
  `email` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `created_by` bigint(20) DEFAULT NULL,
  `modified_at` datetime DEFAULT NULL,
  `modified_by` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `sys_migration` (
  `id` bigint(20) NOT NULL,
  `table` varchar(255) DEFAULT NULL,
  `version` varchar(255) DEFAULT NULL,
  `run_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Tạo class custom reverse engineering strategy

Thông thường chúng ta sẽ extends từ DelegatingReverseEngineeringStrargety để chỉ thực hiện override các phương thức cần thiết.

CustomReverseEngineeringStrategy.java

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
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.gpcoder.reveng;
import java.util.Arrays;
import java.util.List;
import org.hibernate.cfg.reveng.DelegatingReverseEngineeringStrategy;
import org.hibernate.cfg.reveng.ReverseEngineeringStrategy;
import org.hibernate.cfg.reveng.TableIdentifier;
public class CustomReverseEngineeringStrategy extends DelegatingReverseEngineeringStrategy {
    private static final List<String> EXCLUDE_COLUMNS = Arrays.asList(
        "created_by",
        "created_at",
        "modified_at",
        "modified_by"
    );
    public CustomReverseEngineeringStrategy(ReverseEngineeringStrategy delegate) {
        super(delegate);
    }
    @Override
    public boolean excludeTable(TableIdentifier table) {
        if (table.getName().startsWith("sys_")) {
            return true;
        }
        return super.excludeTable(table);
    }
    @Override
    public boolean excludeColumn(TableIdentifier identifier, String columnName) {
        return EXCLUDE_COLUMNS.contains(columnName);
    }
    @Override
    public String tableToClassName(TableIdentifier tableIdentifier) {
        final String defaultClassName = super.tableToClassName(tableIdentifier);
        return defaultClassName.replace("Gp", "");
    }
}

Trong class trên tôi override các phương thức:

  • excludeTable() : không generate các table có prefix “sys_”.
  • excludeColumn() : loại bỏ các column created_by, created_at, modified_at, modified_by khỏi class được generate.
  • tableToClassName()  : bỏ các prefix “gp_” khỏi class name được generate.

Sử dụng class custom reverse engineering strategy

Cấu hình Hiberante

Các bạn tham khảo lại bài viết trước “Sử dụng Hibernate Tool tạo các Hibernate Entity một cách tự động từ các table“.

Tạo tự động các Entity mapping & Annation codes

Tại Hibernate Perspective, chọn Hibernate Code Generation Configurations…

Nhập các thông tin như sau: 

Tạo file reveng.xml, chọn Setup và chọn các bảng cần tạo tự động:

Tiếp theo, chọn Tab Exporters và thiết lập tạo tự động các Entity mapping và Annotation code:

Chọn Run, chúng ta có kết quả sau:

Như bạn thấy kết quả như chúng ta mong muốn.

Tài liệu tham khảo:

Bài viết gốc được đăng tải tại gpcoder.com

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev