有没有正确的方法如何使用 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 模式,而无需隐含地说创建我的枚举类型?

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

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

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

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

最新更新