带Hibernate的Java枚举类型
我在处理数据库中的枚举类型时遇到问题。 我有一个实体带Hibernate的Java枚举类型,java,mysql,spring,hibernate,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")
@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;
...
}
当我创建一个新菜单时,这就是表的外观
第四行是这样通过应用程序插入的
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>
ad_post_init.sql
我有三个问题
ad\u post\u init.sql
初始化菜单类型列,以便菜单类型列包含枚举类型的菜单类型?我想了解hibernate在将menuType写入数据库时实际做了什么,以及在代码中检索对象时如何为我提供正确的menuType值。如果要复制hibernate所做的事情,我的insert语句会是什么样子谢谢,因为您的号码不是enum.ordinal()。这是一个数字,列表中的位置,从0开始 不能在数据库中保存ComplexObject。因此,最终一切都必须变成字符串和数字(以及日期、斑点等)。只有数据库知道的。数据库不知道新创建的枚举。它只能保存一个字符串或数字,该字符串或数字将由Hibernate转换为您的枚举 我能再给你一个建议吗
@Enumerated(EnumType.ORDINAL)
- EnumType.ORDINAL是默认值,因此您可以忽略此选项
- 如果您选择在两者之间添加另一个值,则顺序会更改,您将从模型中获得不同的枚举值
- 如果使用EnumType.STRING,则会保存文本版本。如果在这两者之间添加另一个值,则没有问题
@Enumerated(EnumType.String)
是否有一个注释可以用来自动将数字保存在括号中,例如1作为类别,而不是使用EnumType.ORDINAL?不可以,但有一个解决方法。这里有解释: