hibernate-tools-maven-plugin 5.6.2.Final忽略reveng.xml扫描全库问题
问题
使用hibernate-tools-maven-plugin 5.6.2.Final的hbm2java目标,希望仅为Oracle数据库dsli01 schema下的UAC_USER_SSN表生成Java类,但插件似乎忽略了src/main/resources目录下的reveng.xml配置,扫描了数据库中所有schema的所有表。相关配置文件及执行日志如下:
reveng.xml配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-reverse-engineering SYSTEM "https://hibernate.org/dtd/hibernate-reverse-engineering-3.0.dtd" > <hibernate-reverse-engineering> <!-- This assumes your database connection is pointing to the proper catalog --> <!-- To get all tables in the named schema, use the following <schema-selection match-schema="PM" /> --> <!-- to get only the named tables --> <!-- <schema-selection match-schema="dsli01" match-table="UAC_USER_SSN"/>--> <table-filter match-schema="dsli01" match-name="UAC_USER_SSN" /> </hibernate-reverse-engineering>
hibernate.properties配置
hibernate.dialect=org.hibernate.dialect.Oracle12cDialect #hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver hibernate.connection.url=jdbc:oracle:thin:@10.9.xx.xxx:25100:dsli01.xxxxx.com hibernate.connection.username=dsli01 hibernate.connection.password=xxxxx
pom.xml配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>Test</groupId> <artifactId>Hibernate_Reveng_Maven</artifactId> <version>0.0.1-SNAPSHOT</version> <name>Hibernate Reveng Gen Java</name> <properties> <project.basedir>C:/Kei/SLIS_git_eclipse_2023_09_20231115_2/Hibernate_Reveng (Not work) </project.basedir> <h2.version>1.4.200</h2.version> </properties> <build> <plugins> <plugin> <groupId>org.hibernate</groupId> <artifactId>hibernate-tools-maven-plugin</artifactId> <version>5.6.2.Final</version> <executions> <execution> <id>entity-generation</id> <phase>none</phase> <goals> <goal>hbm2java</goal> </goals> </execution> </executions> <configuration> <ejb3>true</ejb3> <revengFile>src/main/resources/reveng.xml</revengFile> <outputDirectory>src/main/java</outputDirectory> </configuration> <dependencies> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>12.2.0.1</version> </dependency> </dependencies> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-tools-maven-plugin</artifactId> <version>5.6.2.Final</version> </dependency> <!-- https://mvnrepository.com/artifact/com.oracle/ojdbc14 --> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>12.2.0.1</version> </dependency> </dependencies> </project>
执行日志(部分)
[INFO] Scanning for projects... [INFO] [INFO] [1m--------------------< [0;36mTest:Hibernate_Reveng_Maven[0;1m >---------------------[m [INFO] [1mBuilding Hibernate Reveng Gen Java 0.0.1-SNAPSHOT[m [INFO] from pom.xml [INFO] [1m--------------------------------[ jar ]---------------------------------[m [INFO] [INFO] [1m--- [0;32mhibernate-tools:5.6.2.Final:hbm2java[m [1m(default-cli)[m @ [36mHibernate_Reveng_Maven[0;1m ---[m [INFO] Starting Hbm2JavaMojo... Mar 07, 2024 11:55:59 AM org.hibernate.cfg.reveng.OverrideRepository addFile INFO: Override file: C:\Kei\SLIS_git_eclipse_2023_09_20231115_2\Hibernate_Reveng (Not work)\src\main\resources\reveng.xml Mar 07, 2024 11:56:01 AM org.hibernate.Version logVersion INFO: HHH000412: Hibernate ORM core version 5.6.1.Final [INFO] Starting POJO export to directory: C:\Kei\SLIS_git_eclipse_2023_09_20231115_2\Hibernate_Reveng (Not work)\src\main\java... Mar 07, 2024 11:56:01 AM org.hibernate.tool.Version <clinit> INFO: Hibernate Tools 5.6.2.Final Mar 07, 2024 11:56:01 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit> INFO: HCANN000001: Hibernate Commons Annotations {5.1.2.Final} Mar 07, 2024 11:56:01 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!) Mar 07, 2024 11:56:02 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001005: using driver [oracle.jdbc.driver.OracleDriver] at URL [jdbc:oracle:thin:@10.9.200.58:25100:dsli01.unifysoft.com] Mar 07, 2024 11:56:02 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001001: Connection properties: {password=****, user=dsli01} Mar 07, 2024 11:56:02 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001003: Autocommit mode: false Mar 07, 2024 11:56:02 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init> INFO: HHH000115: Hibernate connection pool size: 20 (min=1) Mar 07, 2024 11:56:07 AM org.hibernate.dialect.Dialect <init> INFO: HHH000400: Using dialect: org.hibernate.dialect.Oracle12cDialect Mar 07, 2024 11:56:09 AM org.hibernate.resource.beans.spi.ManagedBeanRegistryInitiator resolveBeanContainer INFO: HHH10005002: No explicit CDI BeanManager reference was passed to Hibernate, but CDI is available on the Hibernate ClassLoader. Mar 07, 2024 11:56:10 AM org.hibernate.cfg.reveng.dialect.OracleMetaDataDialect$1 convertRow INFO: {TABLE_CAT=null, TABLE_NAME=IND$, TABLE_SCHEM=SYS, TABLE_TYPE=TABLE, REMARKS=null} Mar 07, 2024 11:56:10 AM org.hibernate.cfg.reveng.dialect.OracleMetaDataDialect$1 convertRow INFO: {TABLE_CAT=null, TABLE_NAME=CLU$, TABLE_SCHEM=SYS, TABLE_TYPE=TABLE, REMARKS=null} Mar 07, 2024 11:56:10 AM org.hibernate.cfg.reveng.dialect.OracleMetaDataDialect$1 convertRow INFO: {TABLE_CAT=null, TABLE_NAME=ICOL$, TABLE_SCHEM=SYS, TABLE_TYPE=TABLE, REMARKS=null} Mar 07, 2024 11:56:10 AM org.hibernate.cfg.reveng.dialect.OracleMetaDataDialect$1 convertRow INFO: {TABLE_CAT=null, TABLE_NAME=COL$, TABLE_SCHEM=SYS, TABLE_TYPE=TABLE, REMARKS=null} Mar 07, 2024 11:56:10 AM org.hibernate.cfg.reveng.dialect.OracleMetaDataDialect$1 convertRow INFO: {TABLE_CAT=null, TABLE_NAME=TAB$, TABLE_SCHEM=SYS, TABLE_TYPE=TABLE, REMARKS=null} Mar 07, 2024 11:56:10 AM org.hibernate.cfg.reveng.dialect.OracleMetaDataDialect$1 convertRow INFO: {TABLE_CAT=null, TABLE_NAME=LOB$, TABLE_SCHEM=SYS, TABLE_TYPE=TABLE, REMARKS=null} Mar 07, 2024 11:56:10 AM org.hibernate.cfg.reveng.dialect.OracleMetaDataDialect$1 convertRow INFO: {TABLE_CAT=null, TABLE_NAME=COLTYPE$, TABLE_SCHEM=SYS, TABLE_TYPE=TABLE, REMARKS=null} Mar 07, 2024 11:56:10 AM org.hibernate.cfg.reveng.dialect.OracleMetaDataDialect$1 convertRow
原因及解决方案
核心原因
table-filter的逻辑局限:table-filter是在默认扫描结果上做过滤,而非限制扫描范围。Hibernate逆向工程默认会扫描当前用户有权限访问的所有schema和表,即便最终只生成匹配table-filter的实体类,扫描过程依然会遍历所有可见表。- Oracle用户权限问题:当前
dsli01用户拥有访问SYS等系统schema的权限,导致插件扫描时会遍历这些系统schema下的表。
正确配置方式
要限制仅扫描指定schema和表,需使用**schema-selection**明确指定扫描范围,修改reveng.xml如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-reverse-engineering SYSTEM "https://hibernate.org/dtd/hibernate-reverse-engineering-3.0.dtd" > <hibernate-reverse-engineering> <!-- 仅扫描dsli01 schema --> <schema-selection match-schema="dsli01"/> <!-- 仅保留该schema下的UAC_USER_SSN表 --> <table-filter match-name="UAC_USER_SSN"/> </hibernate-reverse-engineering>
也可以直接在schema-selection中同时指定schema和表:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-reverse-engineering SYSTEM "https://hibernate.org/dtd/hibernate-reverse-engineering-3.0.dtd" > <hibernate-reverse-engineering> <schema-selection match-schema="dsli01" match-table="UAC_USER_SSN"/> </hibernate-reverse-engineering>
额外优化建议
- 权限回收:如果不需要访问系统schema,联系DBA回收
dsli01用户对SYS等系统schema的访问权限,从根源减少扫描范围。 - 配置确认:日志已显示
Override file: .../reveng.xml,说明配置文件已被正确加载,无需调整pom.xml中的路径配置。
内容的提问来源于stack exchange,提问作者user1169587
相关产品推荐
相关产品推荐

