如何使用@Entity类名与属性名生成jOOQ对应的类和属性
实现方法
完全可以实现,核心是自定义jOOQ代码生成的命名策略,替换默认读取JPA注解name属性的逻辑即可。
操作步骤
- 编写自定义命名策略类,继承jOOQ默认的
DefaultGeneratorStrategy,重写表、列命名的生成逻辑:public class JpaConsistentNamingStrategy extends DefaultGeneratorStrategy { // 自定义表对应的Java类名:直接用@Entity对应的类简单名称 @Override public String getJavaClassName(Definition definition, Mode mode) { if (definition instanceof TableDefinition tableDef) { // 从Hibernate元数据中获取对应实体类的simpleName返回即可,不需要读取@Table(name)或@Entity(name)的值 return getEntityClassFromTableDef(tableDef).getSimpleName(); } return super.getJavaClassName(definition, mode); } // 自定义列对应的Java标识符:直接用实体类的字段变量名 @Override public String getJavaIdentifier(Definition definition) { if (definition instanceof ColumnDefinition colDef) { // 从Hibernate元数据中获取对应字段的变量名返回即可,不需要读取@Column(name)的值 return getEntityFieldFromColDef(colDef).getName(); } return super.getJavaIdentifier(definition); } // 自行实现从TableDefinition/ColumnDefinition映射对应JPA实体类、字段的逻辑,可通过Hibernate元数据API直接查询 private Class<?> getEntityClassFromTableDef(TableDefinition tableDef) { // 你的实现逻辑 } private Field getEntityFieldFromColDef(ColumnDefinition colDef) { // 你的实现逻辑 } } - 在
jooq-codegen-maven插件配置中注册自定义命名策略,原有其他配置保持不变:<plugin> <groupId>org.jooq</groupId> <artifactId>jooq-codegen-maven</artifactId> <version>你的jOOQ版本</version> <configuration> <generator> <!-- 注册自定义命名策略 --> <strategy> <name>com.你的包路径.JpaConsistentNamingStrategy</name> </strategy> <!-- 你原本的数据库、meta hibernate等其他配置保持不变 --> </generator> </configuration> </plugin>
补充说明
该配置只会修改jOOQ生成的Java类的命名,运行时生成SQL仍会自动使用@Entity、@Column中配置的真实数据库表名、列名,不会影响SQL执行正确性。你后续用jOOQ写查询时就能直接用和JPA实体完全一致的命名,不需要再对应数据库命名。
内容的提问来源于stack exchange,提问作者Alejandro Abdelnur
相关产品推荐
相关产品推荐

