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

时间:2011-04-29 17:50:40

标签: mysql hibernate enums hbm2ddl

我正在使用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部分中使用相同的数据库,我想防止插入无效值。

2 个答案:

答案 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枚举。

最好的问候!