我创建了一个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模式,而无需隐式地说创建我的枚举类型?
最后,我替换了支持枚举的H2,一切看起来都很好。我在Java POJOS中有枚举。
我上次检查时,H2的枚举实现仍然缺少很多东西,我们还不能正确地对它们的枚举进行反向工程,因此无法正常工作。
有没有一种方法可以生成带有枚举的PostgresSQL模式,而无需隐式地说创建我的枚举类型?
如果您连接到实际的数据库实例以生成代码,则在PostgreSQL中使用枚举应该没有任何问题。如果您要使用供应商特定的数据类型(例如枚举,数组等),我建议从等式中删除H2。使用H2总是会造成痛苦。我假设您正在使用H2进行集成测试。我建议将testcontainers与实际的PostgreSQL数据库一起使用。