我有一个 Spring Boot 应用程序,其中 jooq 作为 DAO。
首先,我创建一个枚举类型 role
在 postgresql ( code )
create type role as enum ('admin', 'user');
create table inventory_membership (
user_id integer references user_profile (id),
inventory_id integer references inventory (id),
role role not null default 'user',
primary key (user_id, inventory_id)
)
然后,因为我想使用java枚举role
在我的应用程序中,我配置了我的 pom.xml
如下( code ):
<forcedTypes>
<forcedType>
<userType>com.ocdexperience.sbjooqflywaypoc.db.enums.Role</userType>
<enumConverter>true</enumConverter>
<includeExpression>role</includeExpression>
<includeTypes>.*</includeTypes>
</forcedType>
</forcedTypes>
然后我运行 codegen。这是InventoryMembership
波乔。请注意Role role
字段。
public class InventoryMembership implements Serializable {
private static final long serialVersionUID = 632233638;
private Integer userId;
private Integer inventoryId;
private Role role;
...
}
但是,如果我在没有 <forcedTypes>
的情况下运行 codegen阻止pom.xml
,我会得到Object role
相反,这并不好。
public class InventoryMembership implements Serializable {
private static final long serialVersionUID = -1258093557;
private Integer userId;
private Integer inventoryId;
private Object role;
...
}
似乎<forceTypes>
block 是必须的。然而,在 this example ,没有<forceTypes>
阻止pom.xml
,但生成的代码自动使用生成的枚举,而不是使用 Object
.
这只是因为jooq版本不同吗?我的项目使用 3.12.1,而示例项目使用 3.13。还是因为别的原因?
谢谢。我的项目已准备好在 https://github.com/ocdexperience/sbjooqflyway-poc 中启动并运行.
最佳答案
jOOQ 可以从 PostgreSQL 数据库连接生成开箱即用的枚举类型。然而,问题是您使用的是 org.jooq.meta.extensions.ddl.DDLDatabase,它会在后台解析您的 SQL 并将其转换为 H2。 H2 在最近的版本中存在许多与枚举类型相关的问题,因为它们刚刚开始支持它们。目前,jOOQ 和 H2 仍然无法在 H2 的字典 View 中生成枚举类型。一个相关的错误是这里的: https://github.com/jOOQ/jOOQ/issues/7917
如果您想从 jOOQ 对 PostgreSQL 的 native 枚举支持中获益,我建议您改为连接到实际的 PostgreSQL 数据库,以生成源代码。
关于java - 在java代码中使用postgres枚举必须是jOOQforcedTypes吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58426284/