告诉Hibernate的hbm2ddl为@Enumerated带注释的字段添加MySQL枚举列

| 我正在使用hbm2ddl和类似以下内容的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部分使用了相同的数据库,我想防止插入无效值。     
已邀请:
我相信这会变得很复杂,因为定义java处理的sql类型的java.sql.Types没有枚举类型(因为根据SQL-92,它不是标准化类型)。 如果是这种情况,您可以创建一个扩展EnumType并相应地设置sqlType的休眠自定义UserType,但是由于java.sql.Types无法处理它,因此我看不到如何使用本机sql枚举。 最好的祝福!     
正如Lucas在他的回答中指出的那样,尽管似乎没有办法自动处理MySQL枚举100%,但实际上有一种简单的方法可以将其轮廓化。您可以在
@Column
注释上使用
columnDefinition
属性,该属性似乎专门用于生成自定义DDL代码。 请参阅描述该属性的文档摘录:   (可选)为列生成DDL时使用的SQL片段。      默认为生成的SQL以创建推断类型的列。
NOT NULL
限制是相当标准的,并由另一个属性
nullable
支持。 因此,您的属性定义如下所示:
@Enumerated(EnumType.STRING)
@Column(columnDefinition = \"enum (\'TypeA\', \'TypeB\')\", nullable = false)
private Type type;
    

要回复问题请先登录注册