4

我正在使用 hbm2ddl 创建一个 DB 表,其 Java 代码类似于以下内容:

@Entity
public  class Filter {
    public enum Type {
        TypeA, TypeB;
    }
    @Enumerated(EnumType.STRING)
    private 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 并覆盖以我喜欢的方式呈现枚举字段的更改脚本部分的方法?

背景:项目的 PHP 部分使用了相同的数据库,我想防止插入无效值。

4

2 回答 2

1

尽管似乎没有办法 100% 自动处理 MySQL 枚举,正如 Lucas 在他的回答中指出的那样,实际上有一种简单的方法来勾勒它。您可以columnDefinition在注解上使用属性@Column,这似乎是专门为生成自定义 DDL 代码而设计的。

请参阅描述该属性的文档摘录:

(可选)为列生成 DDL 时使用的 SQL 片段。

默认为生成的 SQL 以创建推断类型的列。

NOT NULL限制是相当标准的,并且由另一个属性支持nullable

因此,您的属性定义如下所示:

@Enumerated(EnumType.STRING)
@Column(columnDefinition = "enum ('TypeA', 'TypeB')", nullable = false)
private Type type;
于 2014-01-15T15:29:07.353 回答
0

我相信这会很复杂,因为定义 java 处理的 sql 类型的 java.sql.Types 没有枚举类型(因为它不是 SQL-92 的标准化类型)。

如果这种情况,您可以创建一个扩展 EnumType 的休眠自定义 UserType 并相应地设置 sqlType,但由于 java.sql.Types 不处理它,我看不到如何使用本机 sql 枚举。

最好的祝福!

于 2011-04-29T18:14:27.877 回答