JOOQ 生成的 pojo 缺少 GeneratedValue 注释
JOOQ generated pojo missing GeneratedValue annotation
我正在使用 jooq 为我的 H2 db table
生成 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 注释,这使得无法使用 spring 数据存储库插入新记录,因为传入的对象总是抱怨 id 字段不存在设置。
我可以做什么 config/work 让 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>
从 jOOQ 3.7 开始,这是一个缺失的功能。参见:https://github.com/jOOQ/jOOQ/issues/5009
您有几种解决方法:
- 通过将
@Id
替换为 @Id @javax.persistence.GeneratedValue(javax.persistence.GenerationType.IDENTITY)
使用 search-replace Maven plugin 修补生成的代码(假设您所有的主键都是 AUTO_INCREMENT
)
- 修补 jOOQ-codegen 的
JavaGenerator
的 org.jooq.util.JavaGenerator.printColumnJPAAnnotation()
方法并自己添加该代码。
我正在使用 jooq 为我的 H2 db table
生成 pojoCREATE 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 注释,这使得无法使用 spring 数据存储库插入新记录,因为传入的对象总是抱怨 id 字段不存在设置。
我可以做什么 config/work 让 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>
从 jOOQ 3.7 开始,这是一个缺失的功能。参见:https://github.com/jOOQ/jOOQ/issues/5009
您有几种解决方法:
- 通过将
@Id
替换为@Id @javax.persistence.GeneratedValue(javax.persistence.GenerationType.IDENTITY)
使用 search-replace Maven plugin 修补生成的代码(假设您所有的主键都是AUTO_INCREMENT
) - 修补 jOOQ-codegen 的
JavaGenerator
的org.jooq.util.JavaGenerator.printColumnJPAAnnotation()
方法并自己添加该代码。