我正在使用hbm2ddl创建一个DB表,其Java代码类似于以下内容:
@Entity
public class Filter {
public enum Type {
TypeA, TypeB;
}
@Enumerated(EnumType.STRING)
private Type type;
}
它工作正常,但对于“type”,会创建一个VARCHAR列,即DDL代码如下所示:
CREATE TABLE IF NOT EXISTS `filter` (`type` varchar(255) DEFAULT NULL)
但我想拥有的是:
CREATE TABLE IF NOT EXISTS `filter` (`type` enum('TypeA','TypeB') NOT NULL)
这是否可以在Hibernate中声明,首选带注释?
或者有没有办法扩展SchemaUpdate并覆盖以我喜欢的方式呈现枚举字段的alter script部分的方法?
背景:在项目的PHP部分中使用相同的数据库,我想防止插入无效值。
答案 0 :(得分:1)
虽然似乎没有办法100%自动处理MySQL枚举,正如卢卡斯在他的回答中指出的那样,实际上有一种简单的方法可以对其进行轮廓分析。您可以在columnDefinition
注释上使用@Column
属性,该注释似乎专门用于生成自定义DDL代码。
请参阅描述属性的文档摘录:
(可选)为列生成DDL时使用的SQL片段。
默认为生成的SQL以创建推断类型的列。
NOT NULL
限制非常标准,并受另一个属性nullable
支持。
因此,您的属性定义如下所示:
@Enumerated(EnumType.STRING)
@Column(columnDefinition = "enum ('TypeA', 'TypeB')", nullable = false)
private Type type;
答案 1 :(得分:0)
我相信这会很复杂,因为定义java处理的sql类型的java.sql.Types没有枚举类型(因为根据SQL-92它不是标准化类型)。
如果 这种情况你可以创建一个hibernate自定义UserType扩展EnumType并相应地设置sqlType,但由于java.sql.Types没有处理它,我看不到如何使用本机sql枚举。
最好的问候!