Hibernate4映射枚举类型

使用hibernate的过程中,会用到枚举类型,比如一个User表,User会有好几种状态例如:正常,无状态,禁用等!

这是枚举类:
package demo.ljl.hibernate4;

public enum StatuEnum {
ACTIVE, DISABLED, INVALID
}


三种状态这里是,User类如下:

package demo.ljl.hibernate4;

public class User {
private int id;
private String name;
private StatuEnum statu;



public StatuEnum getStatu() {
return statu;
}
public void setStatu(StatuEnum statu) {
this.statu = statu;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return BeanToStringUtils.toString(this);
}
}


使用配置文件映射如下:

<?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="demo.ljl.hibernate4.User" table="t_user">
<cache usage="read-only" region="user_cache"/>
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<property name="statu">
<type name="org.hibernate.type.EnumType">
<param name="enumClass">demo.ljl.hibernate4.StatuEnum</param>
<param name="type">-6</param>
</type>
</property>
</class>

</hibernate-mapping>


在映射statu的时候,使用如上配置,使用type标签指定Hibernate的枚举类型,在param标签中使用enumClass指定你的枚举类,在这里如果不加
<param name="type">-6</param>

[color=red]这里的type的值-6为java.sql.Types中的常量,即:TINYINT(4个长度的int)[/color]
则默认为Integer类型,这样最终映射到数据库是int(11),11个长度的int,这样太浪费空间了,而bit是不能指定的,之所以依然存在是为了兼容以前的版本!所以最小的就是tinyint了。

而实际上4个长度的int所能表示的范围已经足够大了-9999到9999,所以可以指定type为-6,那么最终数据库生成的表就是tinyint(4);

当往数据库中插入数据的时候,保存的为枚举常量的索引值,比如上面定义了三个常量,当u.setStatu(StatuEnum.INVALID)的时候,保存到数据库中的值为2,因为INVALID是第二位!

如果想要保存到数据库中的值为枚举常量的字符串值比如INVALID,则指定type为12,也即varchar,但是这样hibernate默认取长度为255,显然更浪费,虽然你可以使用length来限制长度,但是这个长度起码得是枚举常量中字符串最长的那个,显然使用tinyint是最合适不过了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值