使用jOOQ Codegen从依赖JPA实体生成类失败:无实体添加
我尝试用jOOQ Codegen插件,基于依赖中的JPA实体类生成代码。这些实体类未使用注解,而是通过另一依赖中的XML映射文件(*entity.hbm.xml)配置。我已在项目的persistence.xml中定义持久化单元,列出映射文件相对路径,且Maven模块已引入相关依赖,但插件生成失败,抛出以下警告:
[WARNING] No entities added : No entities were added to the MetadataSources
This can have several reasons, including:
- The packages you've listed do not exist (org.n52.series.db.beans.DataEntity,
org.n52.series.db.beans.PlatformEntity,
org.n52.series.db.beans.ProcedureEntity,
org.n52.series.db.beans.PhenomenonEntity,
org.n52.series.db.beans.DatasetEntity,
org.n52.series.db.beans.FeatureEntity,
org.n52.series.db.beans.sta.HistoricalLocationEntity,
org.n52.series.db.beans.sta.LocationEntity,
org.n52.series.db.beans.UnitEntity,
org.n52.series.db.beans.FormatEntity,
org.n52.series.db.beans.parameter.dataset,
org.n52.series.db.beans.parameter.procedure,
org.n52.series.db.beans.parameter.platform,
org.n52.series.db.beans.parameter.observation,
org.n52.series.db.beans.parameter.feature,
org.n52.series.db.beans.parameter.location,
org.n52.series.db.beans.parameter.phenomenon)- The entities in the listed packages are not on the JPADatabase classpath (you must compile them before running jOOQ's codegen...)
我的pom.xml中build插件配置如下:
<build> <plugins> <plugin> <groupId>dev.aspectj</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.13.1</version> <configuration> <complianceLevel>17</complianceLevel> <aspectLibraries> <aspectLibrary> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> </aspectLibrary> </aspectLibraries> </configuration> <executions> <execution> <goals> <goal>compile</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>17</source> <target>17</target> </configuration> </plugin> <plugin> <groupId>org.jooq</groupId> <artifactId>jooq-codegen-maven</artifactId> <version>3.19.10</version> <executions> <execution> <id>generate-h2-jpa</id> <phase>process-resources</phase> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <generator> <database> <name>org.jooq.meta.extensions.jpa.JPADatabase</name> <properties> <property> <key>persistenceUnitName</key> <value>default-unit</value> </property> <property> <key>packages</key> <value> org.n52.series.db.beans.DataEntity, org.n52.series.db.beans.PlatformEntity, org.n52.series.db.beans.ProcedureEntity, org.n52.series.db.beans.PhenomenonEntity, org.n52.series.db.beans.DatasetEntity, org.n52.series.db.beans.FeatureEntity, org.n52.series.db.beans.sta.HistoricalLocationEntity, org.n52.series.db.beans.sta.LocationEntity, org.n52.series.db.beans.UnitEntity, org.n52.series.db.beans.FormatEntity, org.n52.series.db.beans.parameter.dataset, org.n52.series.db.beans.parameter.procedure, org.n52.series.db.beans.parameter.platform, org.n52.series.db.beans.parameter.observation, org.n52.series.db.beans.parameter.feature, org.n52.series.db.beans.parameter.location, org.n52.series.db.beans.parameter.phenomenon </value> </property> </properties> </database> <target> <packageName>package org.n52.sta.data.cloudnative.schema</packageName> <directory>src/main/java</directory> </target> </generator> </configuration> <dependencies> <dependency> <groupId>org.jooq</groupId> <artifactId>jooq-meta-extensions-hibernate</artifactId> <version>3.19.10</version> </dependency> <dependency> <groupId>jakarta.persistence</groupId> <artifactId>jakarta.persistence-api</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.n52.sensorweb-server.db-model</groupId> <artifactId>db-model-entities</artifactId> <version>${db-model.version}</version> </dependency> <dependency> <groupId>org.n52.sensorweb-server.db-model</groupId> <artifactId>db-model-mappings</artifactId> <version>${db-model.version}</version> </dependency> </dependencies> </plugin> </plugins> </build>
IntelliJ显示依赖已正常加载:

调整插件执行阶段
当前jOOQ Codegen在process-resources阶段执行,此时依赖实体类尚未编译到类路径。将执行阶段改为process-classes,确保实体类编译完成后再生成代码:<execution> <id>generate-h2-jpa</id> <phase>process-classes</phase> <goals> <goal>generate</goal> </goals> </execution>修正
packages配置
配置中的packages属性混合了具体类和包路径,JPADatabase的packages参数仅需填写包路径,无需指定具体类名。将具体类替换为其所在包:<property> <key>packages</key> <value> org.n52.series.db.beans, org.n52.series.db.beans.sta, org.n52.series.db.beans.parameter.dataset, org.n52.series.db.beans.parameter.procedure, org.n52.series.db.beans.parameter.platform, org.n52.series.db.beans.parameter.observation, org.n52.series.db.beans.parameter.feature, org.n52.series.db.beans.parameter.location, org.n52.series.db.beans.parameter.phenomenon </value> </property>修正
packageName配置target/packageName中冗余了package前缀,直接填写包名即可:<packageName>org.n52.sta.data.cloudnative.schema</packageName>确认persistence.xml配置有效性
检查persistence.xml是否位于src/main/resources/META-INF/下,且持久化单元default-unit中正确声明了所有实体类和映射文件:<persistence-unit name="default-unit"> <class>org.n52.series.db.beans.DataEntity</class> <!-- 其他实体类声明 --> <mapping-file>META-INF/entity.hbm.xml</mapping-file> <!-- 其他映射文件声明 --> </persistence-unit>验证映射文件可访问性
确认db-model-mappings依赖中的*entity.hbm.xml文件存在于JAR包的对应路径下,确保JPADatabase能读取到这些映射文件。
内容的提问来源于stack exchange,提问作者Humaid Kidwai

