当前位置:  开发笔记 > 编程语言 > 正文

Hibernate中的枚举

如何解决《Hibernate中的枚举》经验,为你挑选了2个好方法。

在DAO中包含一个字段通常很有用,其值来自Java枚举.典型示例是登录DAO,其中您通常具有将用户表征为"NORMAL"或"ADMIN"的字段.在Hibernate中,我将使用以下2个对象以(半)类型安全的方式表示这种关系:

class User {
    String username;
    String passwd;
    UserType type;
}

class UserType {
    private enum Type {ADMIN, NORMAL};
    private String type;

    //Setters/Getters for Hibernate
    public void setType(String type);
    public String getType();

    //Setters/Getters for user
    public void setUserType(UserType.Type t);
    public UserType.Type getUserType();

    public static UserType fromType(UserType.Type t);
}

这是有效的,但是我发现了UserType类,并且需要太多的官僚作风来存储一些值.理想情况下,Hibernate应该直接支持枚举字段,并创建一个额外的表来存储枚举值.

我的问题是:有没有办法在Hibernate中直接映射枚举类?如果没有,我表示枚举的模式是否足够好还是我错过了什么?人们使用了哪些其他模式?



1> Gareth Davis..:

使用hibernate或JPA注释:

class User {
   @Enumerated(EnumType.STRING)
   UserType type
}

UserType只是标准的java 5枚举.

我无法想象这仅限于注释,但我实际上并不知道如何使用hbm文件.它可能是非常依赖于版本的,我猜,但我很确定hibernate 3.2+是必需的.

编辑:有可能在一个hbm,但是有点凌乱,看看这个论坛帖子


可能更有效率,但我会把钱放在无法衡量真实系统中的差异上.如果您只是执行@Enumerated,EnumType.ORDINAL实际上是默认值.我认为大多数人(特别是DBA)倾向于更喜欢DB中的枚举名称.
@Enumerated(EnumType.ORDINAL)映射到int的效率更高吗?
你需要问这个问题.
使用STRING而不是ORDINAL,因为它允许您向Enum添加其他元素,而不管顺序如何.

2> Craig..:

从Hibernate文档:http://www.hibernate.org/272.html

您可以为每个枚举创建一个新的typedef,并在属性标记中引用typedef.

示例映射 - 内联标记

  
    
      com.company.project.Suit
    
  

示例映射 - 使用

  
      com.company.project.Suit
  

  
    
  

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有