【问题标题】:Hibernate @Enumerated seems to be ignoredHibernate @Enumerated 似乎被忽略了
【发布时间】:2017-12-05 11:44:10
【问题描述】:

我的类Person 映射了带有枚举Sex 的注释,如果是男性或女性,则表示性别。让我们看看:

@Entity
@Table(name = "PERSON")
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Enumerated(EnumType.STRING)
    @Column(name = "SEX")
    private Sex sex;

    private enum Sex {
        M,
        F;
    } 

    // Getters, setters & constructors
}

当我测试从 MySQL 数据库中获取所有行时,它可以正常工作并且映射是正确的。

数据库已经预定义,这里是列的定义:

`SEX` enum('M','F') NOT NULL

但是,当我使用 hibernate.hbm2ddl.auto=validate 配置 Hibernate 时出现错误:

found [enum (Types#CHAR)], but expecting [varchar(255) (Types#VARCHAR)]

当我使用EnumType.ORDINAL 或根本不使用@Enumerated 时,发生的错误有点不同(expecting [integer (Types#INTEGER)])。

我做错了什么?

【问题讨论】:

    标签: java mysql hibernate enums hibernate-5.x


    【解决方案1】:

    尝试添加列定义

    @Enumerated(EnumType.STRING)
    @Column(name = "SEX" , columnDefinition="ENUM('M','S')" ,nullable = false )
    private Sex sex;
    

    hibernate validate 做检查类型,长度....因为你在 db 级别验证器中有这个认为它是不同的类型。

    我在 Oracle 中没有看到,但在 MySql 中可能是

    【讨论】:

    • 它很冗长,并且在 Java 代码中的两个地方重复了枚举声明。在这个价格下,我不会在 MySQL 中使用枚举作为类型,而是使用 varchar,并且会在此列上添加一个约束以指定接受的值。
    • 由于您将值形式 db 映射到 enum.in db 中,您可以更新此值并且您的代码停止工作
    • 只需添加 @Column(columnDefinition = "enum") 似乎就可以使用 H2。
    • 添加 @Column(columnDefinition = "enum") 在 MySQL 的情况下也可以解决问题
    • Postgresql 不喜欢 @Column(columnDefinition = "enum")。有对应的吗?
    猜你喜欢
    • 2021-10-28
    • 2016-09-30
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2015-12-11
    • 2014-04-15
    • 1970-01-01
    相关资源
    最近更新 更多