java - 在java代码中使用postgres枚举必须是jOOQforcedTypes吗?

标签 java sql jooq

我有一个 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/

相关文章:

java - 解析具有未知值的 JSON

java - 在 JOOQ 中使用有符号整数

postgresql - jOOQ - 插入...选择...返回

sql - Oracle 条件连接语句

c++ - 带有 MySQL Connector stmt->executeQuery() 错误的 VS Express 2013 C++

java - jooq - 从 POJO 插入时排除 id 字段

java - android java消费vb.net wcf服务

java - 在 NetBeans 9 和 11 中打包为 DMG 镜像,JDK 11 返回 "typedef class com.sun.javafx.tools.ant.FXJar cannot be found using the.."

java - 需要永远运行的应用程序的编程语言

mysql - 如何连续20天从mysql中获取一条记录?