【问题标题】:Java Enum type with Hibernate带有 Hibernate 的 Java 枚举类型
【发布时间】:2017-02-23 14:26:10
【问题描述】:

我在处理数据库中的枚举类型时遇到了问题。 我有一个实体,

@Entity
@Table(name="menu")
public class Menu {

    @Id
    @GeneratedValue
    @Column(name="pk_menu_id")
    private int menuId;

    @Column(name="menu_name")
    private String menuName;

    @Column(name="menu_desc")
    private String menuDesc;

    @Enumerated(EnumType.ORDINAL)
    @Column(name="menu_type")
    private MenuType menuType = MenuType.UNCLASSIFIED;
    ...
}

和一个枚举类型

public enum MenuType {
    CATEGORY(1),
    ADMIN(2),
    UNCLASSIFIED(3);

    private int menuType;
    ...
}

当我创建一个新菜单时,这就是表格的样子 menu table

第四行是这样通过应用程序插入的

private Menu createMenu(String title, String description, String url,
    String icon,String menuType){
    Menu menu = new Menu();
    menu.setMenuName(title);
    menu.setMenuDesc(description);
    menu.setUrl(url);
    menu.setIcon(icon);
    menu.setMenuType(MenuType.UNCLASSIFIED);
    iMenuService.insertMenu(menu);
        ...
}

前三行是通过hibernate初始化插入的

<!-- Use this script to initialize the database -->
       <property name="hibernate.hbm2ddl.import_files">ad_post_init.sql</property>

我有三个问题

  1. 为什么第四行的 menu_type 的值显示为零,即使它实际上不是零。
  2. 有没有办法通过我的初始化文件ad_post_init.sql 初始化menu_type 列,使menu_type 列包含枚举类型MenuType?我想了解 hibernate 在将 menuType 写入数据库时​​实际做了什么,以及当我在代码中检索对象时它如何能够为我提供正确的 menuType 值。如果我要复制 hibernate 的作用,我的插入语句会是什么样子?
  3. 如果有更简单的方法(通过我的 sql 文件初始化 menuType),请提出建议。我正在使用 mysql 数据库。

谢谢

【问题讨论】:

  • 如果甚至休眠必须创建表,对于枚举类型,默认情况下它将在数据库中设置整数数据类型,我认为此列将表示枚举类型的顺序。所以我建议你不要使用整数值,而是使用枚举的字符串值。它将在数据库和应用程序中有意义。说休眠使用枚举通过字符串值来解析。把@Enumerated(EnumType.String)

标签: java mysql spring hibernate


【解决方案1】:

0 因为你的号码不是 enum.ordinal()。这是一个数字,在列表中的位置,从 0 开始。

您不能将复杂对象保存在数据库中。因此,最终一切都必须变成字符串和数字(​​以及日期、blob 等)。只有数据库知道什么。您的数据库不知道您新创建的枚举。它只能持久化一个 STRING 或 NUMBER,它们会被 Hibernate 翻译成你的枚举。

我能再给点建议吗?:

@Enumerated(EnumType.ORDINAL)
  • EnumType.ORDINAL 是默认值,因此您可以忽略它。
  • 如果您选择在其间添加另一个值,则 ORDINAL 会发生变化,您将从模型中返回不同的枚举值
  • 如果您使用 EnumType.STRING,您将获得保存的文本版本。如果您随后在其间添加另一个值,则没有问题。

【讨论】:

  • 是否有一个注释可以用来自动将数字保存在括号中,例如 1 表示 CATEGORY 而不是使用 EnumType.ORDINAL?
  • 不,你不能,但是有一个可能的解决方法。在这里解释:stackoverflow.com/questions/5372855/…
猜你喜欢
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多