枚举
/**
* 性别枚举
*/
public enum Gender {
MALE(0), FEMALE(1), OTHER(2);
private Gender(int i) {
this.i = i;
}
private int i;
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
}
1、注解方式。
使用@Enumerated,该枚举中只包含EnumType的属性,可以理解为映射后存储到数据库的数据类型,或者称为映射方式;默认是EnumType.ORDINAL,另有EnumType.STRING。EnumType.ORDINAL映射的是枚举的顺序,EnumType.STRING映射的是枚举的名称。
@Entity
@Table(name = "person")
public class Person {
private Long id;
private String name;
private Gender sex;
private Integer age;
private String remark;
private String unUsed;
@Id
@Column(name = "id", unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
@Column(nullable = false)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@Column(nullable = false)
@Enumerated
public Gender getSex() {
return this.sex;
}
public void setSex(Gender sex) {
this.sex = sex;
}
@Column(nullable = false)
public Integer getAge() {
return this.age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getRemark() {
return this.remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
/** 非数据库表的映射字段,故使用@Transient忽略 */
@Transient
public String getUnUsed() {
return this.unUsed;
}
public void setUnUsed(String unUsed) {
this.unUsed = unUsed;
}
}
2、xml配置文件方式。
意思同注解方式,只是此处使用
<param name="type">12</param>
配置出上面EnumType的效果,type的值是数字,该数字是java.sql.Types对数据库类型的常量定义值,默认是4,即integer型,12即varchar型。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.csst.linzx.test.domain.Person" table="person"> <id column="ID" name="id" type="java.lang.Long"> <generator class="identity" /> </id> <property name="name" type="java.lang.String" not-null="true"> <column name="name"> <comment>姓名</comment> </column> </property> <property name="sex"> <type name="org.hibernate.type.EnumType"> <param name="enumClass">com.test.common.constants.Gender</param> <param name="type">12</param> </type> </property> <property name="age" type="java.lang.Integer"> <column name="age" /> </property> <property name="remark" type="java.lang.String"> <column name="remark" /> </property> </class> </hibernate-mapping>
使用int的存储结果(以下Sex中的值不是枚举中定义的值,而是其排列顺序):
id | name | sex | age | remark |
15 | girl | 1 | 10 | girl r |
16 | boy | 0 | 11 | boy r |
17 | what | 2 | 12 | what r |
使用String的存储结果:
id | name | sex | age | remark |
18 | girl | FEMALE | 10 | girl r |
19 | boy | MALE | 11 | boy r |
20 | what | OTHER | 12 | what r |
以上的方式是简易式的,如果需要映射指定的值——枚举括号中的值,需要使用hibernate的自定义类型UserType来定义枚举,很麻烦,砖家称不到万不得已不推荐使用。