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

@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)

)

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

CustomerEO customer = new CustomerEO();

customer.setName(“Janet2”);

customer.setType(CustomerType.PARTNER);

entityManager.persist(customer);

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

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

public enum EnumType {

ORDINAL,

STRING

}

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

若此时改成</span>ORDINAL,代码如下:

@Enumerated(EnumType.ORDINAL)

public CustomerType getType() {

return type;

}

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

l 如何选择STRING和</span>ORDINAL:</span>

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

public enum CustomerType {

CUST_COMPETITOR, INVESTOR, PARTNER, VENDER

}

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

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

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

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

public enum BusinessLine {

REAL_ESTATE,FINANCE, NON_PROFIT

}

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

@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;

}

}

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注