Hibernate对Enum的映射的基本使用方法

枚举

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

猜你喜欢

转载自linzx0212.iteye.com/blog/2220632