首页 > 解决方案 > 有没有一种正确的方法可以使用 JOOQ 为所有方言创建一个包含枚举的表?

问题描述

我创建了一个由 Flyway 执行的 JOOQ 脚本,以创建一个带有一个枚举的表。当方案生成到运行的 PostgresSQL 实例中时,生成的 POJOS 枚举信息会丢失,并且该字段只是一个字符串。

sl.alterTable("tableName").addColumn("column", SQLDataType.VARCHAR.asEnumDataType(MyEnum.class)).execute();

// ...

enum MyEnum implements EnumType {
    A("A"),
    B("B");

    private final String literal;

    MyEnum(String literal) {
        this.literal = literal;
    }

    @Override
    public String getLiteral() {
        return literal;
    }

    @Override
    public String getName() {
        return V2020_01_09__table_constant.State.class.getName().toLowerCase();
    }
}

要从 PostgresSQL 数据库生成枚举到 Java,我需要执行以下 hack 并区分 DB 方言。所以我需要为每一次迁移以一种特殊的方式处理枚举。

if (dsl.dialect().equals(SQLDialect.POSTGRES)) {
    dsl.createType("MyEnum").asEnum("a", "b").execute();
    dsl.alterTable("tableName").addColumn("column", new DefaultDataType<>(null, MyEnum.class, "myenum")).execute();
} else {
    dsl.alterTable("tableName").addColumn("column", SQLDataType.VARCHAR.asEnumDataType(MyEnum.class)).execute();
}

最后,我更换了支持枚举的 H2,一切看起来都很好。我在 Java POJOS 中有枚举。但是可能在 PostgresSQL 上运行的生产数据库仍然获得 varchars 类型。

有没有办法如何使用枚举生成 PostgresSQL 模式而不隐含地说创建我的枚举类型?

标签: javaenumsmigrationjooqflyway

解决方案


最后,我更换了支持枚举的 H2,一切看起来都很好。我在 Java POJOS 中有枚举。

上次我检查时,H2 的枚举实现仍然缺少很多东西,我们还不能正确地对它们的枚举进行逆向工程,所以效果不好。

有没有办法如何使用枚举生成 PostgresSQL 模式而不隐含地说创建我的枚举类型?

如果您连接到实际的数据库实例进行代码生成,那么在 PostgreSQL 中使用枚举应该没有任何问题。如果您要使用供应商特定的数据类型(如枚举、数组等),我建议从等式中删除 H2。使用 H2 只会一直造成痛苦。我假设您正在使用 H2 进行集成测试。我建议使用带有实际 PostgreSQL 数据库的测试容器。


推荐阅读