我在使用数据库中的枚举类型时遇到问题。 我有一个实体,
@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>
我有三个问题
ad_post_init.sql
初始化menu_type列,以便menu_type列包含枚举类型MenuType?我想了解hibernate在将menuType写入数据库时实际上做了什么,以及当我在代码中检索对象时它如何能够给我正确的menuType值。如果我要复制hibernate做什么,我的insert语句会是什么样的?由于
答案 0 :(得分:0)
0因为你的号码不是enum.ordinal()。这是一个数字,列表中的位置,从0开始。
您无法在数据库中保存ComplexObjects。因此,最终一切都必须成为字符串和数字(以及日期,blob等)。只有数据库知道什么。您的数据库不知道您新创建的枚举。它只能保留一个STRING或NUMBER,它将被Hibernate转换为你的枚举。
我可以提供其他建议吗?:
@Enumerated(EnumType.ORDINAL)