java - 有没有一种正确的方法可以使用 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 只会一直造成痛苦。我假设您正在使用 H2 进行集成测试。我建议使用带有实际 PostgreSQL 数据库的测试容器。
推荐阅读
- c# - 如何从类 (.cs) 调用/更新 blazor 变量/方法
- python - 从图像中去除色带
- go - Go - 锁定互斥锁的非阻塞方式
- javascript - 使用 lit-html 渲染的嵌套 HTMLElement 会覆盖父模板
- c++ - 查找共享库的位置以将其与 MASTIK 映射
- java - 整数的大写对于缓冲区写入是否重要?
- android - CollapsingToolbarLayout 动画错误行为
- javascript - React useContext 和 useReducer - 需要应用程序中的全局状态,对使用一个 vs 多个减速器感到困惑
- python - 查找数组的子列表
- flutter - 如何忽略 Flutter 中 CustomScrollView 的 Sliver 上的点击事件?