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;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn 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 name="code"><param name="type">-6</param>
这里的type的值-6为java.sql.Types中的常量,即:TINYINT(4个长度的int)
则默认为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是最合适不过了!