我有一个以jooq作为DAO的弹簧启动应用程序。
首先,我在 postgresql 中创建一个枚举类型role
(代码(
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
:
<forcedTypes>
<forcedType>
<userType>com.ocdexperience.sbjooqflywaypoc.db.enums.Role</userType>
<enumConverter>true</enumConverter>
<includeExpression>role</includeExpression>
<includeTypes>.*</includeTypes>
</forcedType>
</forcedTypes>
然后我运行代码生成。这是InventoryMembership
pojo。请注意Role role
字段。
public class InventoryMembership implements Serializable {
private static final long serialVersionUID = 632233638;
private Integer userId;
private Integer inventoryId;
private Role role;
...
}
但是,如果我在pom.xml
中运行没有<forcedTypes>
块的代码生成,我会得到Object role
,这不好。
public class InventoryMembership implements Serializable {
private static final long serialVersionUID = -1258093557;
private Integer userId;
private Integer inventoryId;
private Object role;
...
}
似乎<forceTypes>
块是必须的。但是,在这个例子中,pom.xml
中没有<forceTypes>
块,但生成的代码会自动使用生成的枚举,而不是使用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 的字典视图中生成枚举类型。一个相关的错误是这里的: https://github.com/jOOQ/jOOQ/issues/7917
如果你想从jOOQ对PostgreSQL的原生枚举支持中获益,我建议改用一个实际的PostgreSQL数据库来生成源代码。