【发布时间】: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>
我有三个问题
- 为什么第四行的 menu_type 的值显示为零,即使它实际上不是零。
- 有没有办法通过我的初始化文件
ad_post_init.sql初始化menu_type 列,使menu_type 列包含枚举类型MenuType?我想了解 hibernate 在将 menuType 写入数据库时实际做了什么,以及当我在代码中检索对象时它如何能够为我提供正确的 menuType 值。如果我要复制 hibernate 的作用,我的插入语句会是什么样子? - 如果有更简单的方法(通过我的 sql 文件初始化 menuType),请提出建议。我正在使用 mysql 数据库。
谢谢
【问题讨论】:
-
如果甚至休眠必须创建表,对于枚举类型,默认情况下它将在数据库中设置整数数据类型,我认为此列将表示枚举类型的顺序。所以我建议你不要使用整数值,而是使用枚举的字符串值。它将在数据库和应用程序中有意义。说休眠使用枚举通过字符串值来解析。把
@Enumerated(EnumType.String)
标签: java mysql spring hibernate