JOOQ 生成 pojo 缺少 GeneratedValue 注释

Posted

技术标签:

【中文标题】JOOQ 生成 pojo 缺少 GeneratedValue 注释【英文标题】:JOOQ generated pojo missing GeneratedValue annotation 【发布时间】:2016-05-05 17:24:21 【问题描述】:

我正在使用 jooq 为我的 H2 数据库表生成 pojo

CREATE TABLE PUBLIC.ABC (
  ID          BIGINT AUTO_INCREMENT PRIMARY KEY,
  TRADE_DATE  DATE,
  STK_CODE    VARCHAR(63),
  REMARKS     TEXT,
  TIMESTAMP   TIMESTAMP NOT NULL
);

但是生成的代码(下)



    ...
    @Id
    @Column(name = "ID", unique = true, nullable = false, precision = 19)
    public Long getId() 
        return this.id;
    
    ...


缺少 @GeneratedValue 注释,由于传入的对象总是抱怨未设置 id 字段,因此无法使用 Spring Data Rest 存储库插入新记录。

我可以做哪些配置/解决方法来让 jooq 正常工作?

下面是我在编译时用来生成pojo的相关pom文件部分:

<plugin>
    <groupId>org.jooq</groupId>
    <artifactId>jooq-codegen-maven</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>$h2.version</version>
        </dependency>
    </dependencies>
    <configuration>
        <!-- JDBC connection parameters -->
        <jdbc>
            <driver>org.h2.Driver</driver>
            <url>jdbc:h2:$user.home/</url>
        </jdbc>
        <!-- Generator parameters -->
        <generator>
            <database>
                <name>org.jooq.util.h2.H2Database</name>
                <includes>.*</includes>
                <schemata>
                    <schema>
                        <inputSchema>PUBLIC</inputSchema>
                    </schema>
                </schemata>
            </database>
            <target>
                <packageName>org.abc</packageName>
                <directory>target/generated-sources/jooq</directory>
            </target>
            <generate>
                <pojos>true</pojos>
                <jpaAnnotations>true</jpaAnnotations>
            </generate>
        </generator>
    </configuration>
</plugin>

解决方法

对于在添加功能之前遇到相同问题的任何人,最终选择替换路线,插件代码如下:

    <plugin>
        <groupId>com.google.code.maven-replacer-plugin</groupId>
        <artifactId>replacer</artifactId>
        <version>1.5.3</version>
        <executions>
            <execution>
                <phase>prepare-package</phase>
                <goals>
                    <goal>replace</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <basedir>$project.basedir/$jooq.gen.dir</basedir>
            <filesToInclude>tables/pojos/*.java</filesToInclude>
            <replacements>
                <replacement>
                    <token>@Id</token>
                    <value>@Id @javax.persistence.GeneratedValue</value>
                </replacement>
            </replacements>
        </configuration>
    </plugin>

【问题讨论】:

【参考方案1】:

从 jOOQ 3.7 开始,这是一个缺失的功能。见:https://github.com/jOOQ/jOOQ/issues/5009

您有几种解决方法:

    使用search-replace Maven plugin 修补生成的代码,将@Id 替换为@Id @javax.persistence.GeneratedValue(javax.persistence.GenerationType.IDENTITY)(假设所有主键都是AUTO_INCREMENT) 修补 jOOQ-codegen 的 JavaGeneratororg.jooq.util.JavaGenerator.printColumnJPAAnnotation() 方法并自己添加该代码。

【讨论】:

以上是关于JOOQ 生成 pojo 缺少 GeneratedValue 注释的主要内容,如果未能解决你的问题,请参考以下文章

jOOQ 和自动生成,如何避免表 POJO 中的 UDT 记录

jOOQ 我可以将两个表的连接提取到各自的 POJO 中吗

如何使用默认构造函数和设置器生成 pojo

H2 AUTO_INCREMENT PK 的 JOOQ 代码生成器,带有 japAnnotations

使用 JOOQ 从 POJO 设置字段为空

从 POJO 到 Record 的 jOOQ 映射器