是否有正确的方法为JOOQ的所有方言创建带有枚举的表?

问题描述 投票:0回答:1

我创建了一个JOOQ脚本,该脚本由Flyway执行,以创建带有一个枚举的表。当该方案生成为正在运行的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枚举,我需要进行以下修改并区分数据库方言。因此,对于每个迁移,我都需要以特殊的方式对待枚举。

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模式,而无需隐式地说创建我的枚举类型?

java enums migration jooq flyway
1个回答
0
投票

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

我上次检查时,H2的枚举实现仍然缺少很多东西,我们还不能正确地对它们的枚举进行反向工程,因此无法正常工作。

有没有一种方法可以生成带有枚举的PostgresSQL模式,而无需隐式地说创建我的枚举类型?

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

© www.soinside.com 2019 - 2024. All rights reserved.