带有Hibernate的Java Enum类型

时间:2017-02-23 14:26:11

标签: java mysql spring hibernate

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

@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);
        ...
}

前三行是通过休眠初始化

插入的
<!-- 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做什么,我的insert语句会是什么样的?
  3. 如果有更简单的方法(通过我的sql文件初始化menuType),请建议。我正在使用mysql数据库。
  4. 由于

1 个答案:

答案 0 :(得分:0)

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

您无法在数据库中保存ComplexObjects。因此,最终一切都必须成为字符串和数字(​​以及日期,blob等)。只有数据库知道什么。您的数据库不知道您新创建的枚举。它只能保留一个STRING或NUMBER,它将被Hibernate转换为你的枚举。

我可以提供其他建议吗?:

@Enumerated(EnumType.ORDINAL)
  • EnumType.ORDINAL是默认设置,因此您可以将其删除。
  • 如果您选择在其中添加其他值,则ORDINAL会更改,您将从模型中返回不同的枚举值
  • 如果您使用EnumType.STRING,您将获得保存的文本版本。如果您在中间添加另一个值,则没有问题。