告诉 Hibernate 的 hbm2ddl 为 @Enumerated 注释字段添加 MySQL 枚举列
Posted
技术标签:
【中文标题】告诉 Hibernate 的 hbm2ddl 为 @Enumerated 注释字段添加 MySQL 枚举列【英文标题】:Tell Hibernate's hbm2ddl to add MySQL enum columns for @Enumerated annotated fields 【发布时间】:2011-08-15 16:24:23 【问题描述】:我正在使用 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 部分使用了相同的数据库,我想防止插入无效值。
【问题讨论】:
【参考方案1】:我相信这会很复杂,因为定义 java 处理的 sql 类型的 java.sql.Types 没有枚举类型(因为它不是 SQL-92 的标准化类型)。
如果 是这种情况,您可以创建一个扩展 EnumType 并相应设置 sqlType 的休眠自定义 UserType,但由于 java.sql.Types 不处理它,我不知道如何使用本机 sql 枚举。
最好的问候!
【讨论】:
【参考方案2】:虽然似乎没有办法 100% 自动处理 mysql 枚举,正如 Lucas 在他的回答中指出的那样,实际上有一个简单的方法来勾勒它。您可以在@Column
注释上使用columnDefinition
属性,这似乎是专门为生成自定义DDL 代码而设计的。
请参阅描述该属性的文档摘录:
(可选)为列生成 DDL 时使用的 SQL 片段。
默认使用生成的 SQL 来创建推断类型的列。
NOT NULL
限制非常标准,并且由另一个属性 nullable
支持。
因此,您的属性定义如下所示:
@Enumerated(EnumType.STRING)
@Column(columnDefinition = "enum ('TypeA', 'TypeB')", nullable = false)
private Type type;
【讨论】:
以上是关于告诉 Hibernate 的 hbm2ddl 为 @Enumerated 注释字段添加 MySQL 枚举列的主要内容,如果未能解决你的问题,请参考以下文章
为啥当我将 hbm2ddl.auto 设置为创建时,Hibernate 会抛出 SQLGrammarException 说表/视图不存在?
使用 hibernate.hbm2ddl.auto create 找不到表
Hibernate: hibernate.hbm2ddl.auto=update 显示生成的 sql
休眠 - hibernate.hbm2ddl.auto = 验证
如何在 Wildfly 部署时设置 hibernate.hbm2ddl.auto 不使用 persistence.xml