GP Coder

Trang chia sẻ kiến thức lập trình Java

  • Java Core
    • Basic Java
    • OOP
    • Exception Handling
    • Multi-Thread
    • Java I/O
    • Networking
    • Reflection
    • Collection
    • Java 8
  • Design pattern
    • Creational Pattern
    • Structuaral Pattern
    • Behavior Pattern
  • Web Service
    • SOAP
    • REST
  • JPA
  • Java library
    • Report
    • Json
    • Unit Test
  • Message Queue
    • ActiveMQ
    • RabbitMQ
  • All
Trang chủ JPA Hibernate reverse engineering – Customize code generation sử dụng custom strategy class

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

Đăng vào 29/12/2019 . Được đăng bởi GP Coder . 3895 Lượt xem . Toàn màn hình

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.

Nội dung

  • 1 Giới thiệu ReverseEngineeringStrategy
  • 2 Khởi tạo project
  • 3 Tạo class custom reverse engineering strategy
  • 4 Sử dụng class custom reverse engineering strategy

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:


<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-tools -->
<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-tools</artifactId>
	<version>5.4.10.Final</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<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:


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


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:

  • https://tools.jboss.org/features/hibernate.html
  • https://docs.jboss.org/tools/latest/en/hibernatetools/html_single/index.html
5.0
06
Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé! Và Donate tác giả

Shares

Chuyên mục: JPA Được gắn thẻ: Hibernate, Hibernate Tools, JPA

Tạo database table tự động từ Hibernate Entity
Sử dụng Hibernate Tools tạo các Entity và DAO class

Có thể bạn muốn xem:

  • Giới thiệu về Hibernate (28/10/2019)
  • Sử dụng Hibernate Tool tạo các Hibernate Entity một cách tự động từ các table (26/11/2019)
  • Hibernate Criteria Query Language (HCQL) (19/02/2020)
  • Hibernate Cache (01/04/2020)
  • Sử dụng Hibernate Tools tạo các Entity và DAO class (29/01/2020)

Bình luận

bình luận

Tìm kiếm

Bài viết mới

  • Clean code 13/01/2024
  • Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud 02/10/2020
  • Kết nối RabbitMQ sử dụng Web STOMP Plugin 19/06/2020
  • Sử dụng publisher confirm trong RabbitMQ 16/06/2020
  • Sử dụng Dead Letter Exchange trong RabbitMQ 13/06/2020

Xem nhiều

  • Hướng dẫn Java Design Pattern – Factory Method (97345 lượt xem)
  • Hướng dẫn Java Design Pattern – Singleton (96978 lượt xem)
  • Giới thiệu Design Patterns (86634 lượt xem)
  • Lập trình đa luồng trong Java (Java Multi-threading) (85467 lượt xem)
  • Giới thiệu về Stream API trong Java 8 (83017 lượt xem)

Nội dung bài viết

  • 1 Giới thiệu ReverseEngineeringStrategy
  • 2 Khởi tạo project
  • 3 Tạo class custom reverse engineering strategy
  • 4 Sử dụng class custom reverse engineering strategy

Lưu trữ

Thẻ đánh dấu

Annotation Authentication Basic Java Behavior Pattern Collection Creational Design Pattern Cấu trúc điều khiển Database Dependency Injection Design pattern Eclipse Exception Executor Service Google Guice Gson Hibernate How to Interceptor IO Jackson Java 8 Java Core JDBC JDK Jersey JMS JPA json JUnit JWT Message Queue Mockito Multithreading OOP PowerMockito RabbitMQ Reflection Report REST SOAP Structuaral Pattern Swagger Thread Pool Unit Test Webservice

Liên kết

  • Clean Code
  • JavaTpoint
  • Refactoring Guru
  • Source Making
  • TutorialsPoint
  • W3Schools Online Web Tutorials

Giới thiệu

GP Coder là trang web cá nhân, được thành lập với mục đích lưu trữ, chia sẽ kiến thức đã học và làm việc của tôi. Các bài viết trên trang này chủ yếu về ngôn ngữ Java và các công nghệ có liên quan đến Java như: Spring, JSF, Web Services, Unit Test, Hibernate, SQL, ...
Hi vọng góp được chút ít công sức cho sự phát triển cộng đồng Coder Việt.

Donate tác giả

Tìm kiếm các bài viết của GP Coder với Google Search

Liên hệ

Các bạn có thể liên hệ với tôi thông qua:
  • Trang liên hệ
  • Linkedin: gpcoder
  • Email: contact@gpcoder.com
  • Skype: ptgiang56it

Follow me

Copyright 2025 © GP Coder · All Rights Reserved · Giới thiệu · Chính sách · Điều khoản · Liên hệ ·

Share

Blogger
Delicious
Digg
Email
Facebook
Facebook messenger
Flipboard
Google
Hacker News
Line
LinkedIn
Mastodon
Mix
Odnoklassniki
PDF
Pinterest
Pocket
Print
Reddit
Renren
Short link
SMS
Skype
Telegram
Tumblr
Twitter
VKontakte
wechat
Weibo
WhatsApp
X
Xing
Yahoo! Mail

Copy short link

Copy link