把以前的项目用Hibernate4.2 更新后出现了一系列问题。笔者是hibernate-release-4.2.2.Final版本
折腾时间最久的便是关于枚举映射问题。
在做了个Gender的枚举类之后,采用xml方式配置hbm文件:
<property name="gender" not-null="true" length="5">
<type name="org.hibernate.type.EnumType">
<!-- 12为java.sql.Types.VARCHAR常量值,即保存枚举的字面值到数据库。
如果不指定type参数,保存枚举的索引值(从0开始)到数据库-->
<param name="type">12</param>
<param name="useNamed">true</param>
<param name="enumClass">cn.itcast.global.Gender</param>
</type>
</property>
Hibernate生成的映射到数据库的代码如下:
Hibernate:
create table Employee (
username varchar(20) not null,
password varchar(20) not null,
gender varchar(5) not null,
primary key (username)
)
单元测试,保存一条数据到数据库(其中gender值为Gender.MALE, 枚举的Ordinal值为0),显示结果为gender=0;
网上找不到该版本的源代码,而之前版本的代码看过之后的确配置没问题的。无奈最终查看反编译代码,仔细比对后发现 EnumType类多了个静态常量: public static final java.lang.String NAMED = "useNamed";
在线查找之前版本(4.1.2final),该类的静态常量如下:
org.hibernate.type.EnumType | ||
---|---|---|
public static final String | CATALOG | "catalog" |
public static final String | COLUMN | "column" |
public static final String | ENUM | "enumClass" |
public static final String | SCHEMA | "schema" |
public static final String | TABLE | "table" |
public static final String | TYPE | "type" |
于是笔者在hbm文件里多加了条语句:
<type name="org.hibernate.type.EnumType">
<!-- 12为java.sql.Types.VARCHAR常量值,即保存枚举的字面值到数据库。
如果不指定type参数,保存枚举的索引值(从0开始)到数据库-->
<param name="type">12</param>
<!-- 指定是否gender值是否用枚举的Named还是ordinal,默认为false -->
<param name="useNamed">true</param>
<param name="enumClass">cn.itcast.global.Gender</param>
</type>
</property>
运行结果,gender=MALE;
各位找到了该版本源文件可以再看看。