zoukankan      html  css  js  c++  java
  • 【hibernate】之标注枚举类型@Enumerated(转载)

    实体Entity中通过@Enumerated标注枚举类型,例如将CustomerEO实体中增加一个CustomerType类型的枚举型属性,标注实体后的代码如下所示。

    @Entity
    
    @Table(name = "customer")
    
    public class CustomerEO implements java.io.Serializable {
    
    ……
    
             private CustomerType type;
    
     
    
             @Enumerated(EnumType.STRING)
    
             public CustomerType getType() {
    
                       return type;
    
             }
    
     
    
             public void setType(CustomerType type) {
    
                       this.type = type;
    
             }
    
     
    
             public enum CustomerType {
    
                       COMPETITOR, INVESTOR, PARTNER, VENDER
    
             }
    
     
    
    }

    在实体中虽然标注成枚举类型,但当实体持久化后,表中所对应的值仍旧是基本的数据类型,以上代码创建表的SQL语句是:

    CREATE TABLE customer (
    
             id int(20) NOT NULL auto_increment,
    
             name varchar(255),
    
             type varchar(255),
    
             PRIMARY KEY (id)
    
    )

    使用枚举类型后,在创建实体时便可以直接引用枚举类型,例如以下代码所示。

    CustomerEO customer = new CustomerEO();
    
    customer.setName("Janet2");
    
    customer.setType(CustomerType.PARTNER);
    
    entityManager.persist(customer);

    在使用@Enumerated注释时,需要注意以下几个问题:

    因为枚举类型的有名称和值两个属性,所以在持久化时可以选择持久化名称或是持久化值。通过EnumType来定义,它有两个值如下所示。

    public enum EnumType {
    
    ORDINAL,
    
    STRING
    
    }

    ORDINAL表示持久化的为枚举类型的值,STRING表示持久化的为枚举类型的名称。默认为ORDINAL,持久化值。例如以上示例中标注的为STRING,这样持久化实体后,数据库中保存的是枚举类型的名称,如图所示。

    若此时改成ORDINAL,代码如下:

             

         
         @Enumerated(EnumType.ORDINAL)
             public CustomerType getType() {
    
                       return type;
    
             }
    
    

    则同样持久化的实体后,数据库保存的结果如图所示。

    l         如何选择STRINGORDINAL

    如果使用STRING保存,虽然从数据库中查询数据时非常直观,能够清楚的看出该类型代表意义,但这样也会带来其他的问题。若此时枚举类型的定义改变,例如上例中的枚举类型名称改为:

             public enum CustomerType {

                       CUST_COMPETITOR, INVESTOR, PARTNER, VENDER

             }

    则此时数据库中保存的“COMPETITOR”的值将不能转化为枚举类型CustomerType中的“CUST_COMPETITOR”的值。但若使用ORDINAL则不会带来这种问题。所以建议使用ORDINAL类型来持久化枚举类型。

    l         枚举类型的定义位置,实体外部VS实体内部。

    上例中CustomerType枚举类型定义在CustomerEO实体内部,这是因为只有CustomerEO这个实体会使用CustomerType类型,其他的实体不会使用该类型。该类型与这个实体关系紧密联系。

    但若此时多个实体公用一个枚举类型时,则可以将枚举类型单独定义,定义在实体的外部。有这样一个枚举类型BusinessLine,它定义在实体外部,代码如下:

    public enum BusinessLine {

             REAL_ESTATE,FINANCE, NON_PROFIT

    }

    例如CustomerEO实体增加一个BusinessLine的枚举类型,代码如下所示。

    @Entity
    
    @Table(name = "customer")
    
    public class CustomerEO implements java.io.Serializable {
    
    ……
    
             private BusinessLine businessLine;
    
     
    
             @Enumerated(EnumType.STRING)
    
             public BusinessLine getBusinessLine() {
    
                       return businessLine;
    
             }
    
     
    
             public void setBusinessLine(BusinessLine businessLine) {
    
                       this.businessLine = businessLine;
    
             }
    
    }

    原文出处不明,所以无法加入链接...

  • 相关阅读:
    远程办公的一天:魔幻24小时
    LVS:三种负载均衡方式比较
    程序员的二十句励志名言,看看你最喜欢哪句?
    个人服务器开通~
    jquery大全
    CSS大全
    英语中的连词说明
    高版本SqlServer转低版本SqlServer经验总结
    SQLServer中,sa帐号旁边有个小红箭头
    Entity Framework GroupBy usage
  • 原文地址:https://www.cnblogs.com/gyjx2016/p/5984429.html
Copyright © 2011-2022 走看看