Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带Hibernate的Java枚举类型_Java_Mysql_Spring_Hibernate - Fatal编程技术网

带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
我有三个问题

  • 为什么第四行的menu_type的值显示为零,即使它实际上不是零
  • 是否有方法通过my init file
    ad\u post\u init.sql
    初始化菜单类型列,以便菜单类型列包含枚举类型的菜单类型?我想了解hibernate在将menuType写入数据库时实际做了什么,以及在代码中检索对象时如何为我提供正确的menuType值。如果要复制hibernate所做的事情,我的insert语句会是什么样子
  • 如果有更简单的方法(通过我的sql文件初始化menuType),请建议。我正在使用mysql数据库

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

    不能在数据库中保存ComplexObject。因此,最终一切都必须变成字符串和数字(以及日期、斑点等)。只有数据库知道的。数据库不知道新创建的枚举。它只能保存一个字符串或数字,该字符串或数字将由Hibernate转换为您的枚举

    我能再给你一个建议吗

    @Enumerated(EnumType.ORDINAL)
    
    • EnumType.ORDINAL是默认值,因此您可以忽略此选项
    • 如果您选择在两者之间添加另一个值,则顺序会更改,您将从模型中获得不同的枚举值
    • 如果使用EnumType.STRING,则会保存文本版本。如果在这两者之间添加另一个值,则没有问题

    如果hibernate必须创建表,默认情况下,对于枚举类型,它将在数据库中设置整数数据类型,我认为这一列将表示枚举类型的顺序。所以我建议您不要使用整数值,而是使用枚举的字符串值。这对数据库和应用都有一定的意义。说hibernate使用枚举按字符串值解析。put
    @Enumerated(EnumType.String)
    是否有一个注释可以用来自动将数字保存在括号中,例如1作为类别,而不是使用EnumType.ORDINAL?不可以,但有一个解决方法。这里有解释: