枚举
/** * 性别枚举 */ 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来定义枚举,很麻烦,砖家称不到万不得已不推荐使用。