hibernate enum

先看一张表:

Create table test(

Test_id integer not null auto_increment,

gender Enum(MALE, FEMALE)

)



在hibernate的pojo中可以这样描述:





01.public final class TestVO {
02.
03. private Integer id;
04.
05.public static enum Gender {
06. MALE, FEMALE;
07. }
08. private Gender gender;
09.
10.
11. public Integer getId() {
12. return id;
13. }
14.
15. public void setId(Integer id) {
16. this.id = id;
17. }
18.
19.
20. public Gender getGender() {
21. return gender;
22. }
23.
24. public void setGender(Gender gender) {
25. this.gender = gender;
26. }
27.
28.}
29.

而后要自己写一个适合enum的在hibernate中的类型,虽然hibernate已经有了

Org.hibernate.type.EnumType.但是这个类是用于annotation的(在后面会讨论怎么用annotation技术映射enum).





创建一个自己的EnumUserType:

01.import java.io.Serializable;
02.import java.sql.PreparedStatement;
03.import java.sql.ResultSet;
04.import java.sql.SQLException;
05.import java.sql.Types;
06.
07.import org.hibernate.HibernateException;
08.import org.hibernate.usertype.UserType;
09.import org.apache.log4j.*;
10.
11.public class EnumUserType<E extends Enum<E>> implements UserType {
12. private Logger log = Logger.getLogger(EnumUserType.class);
13.
14. private Class<E> clazz = null;
15.
16. private static final int[] SQL_TYPES = { Types.VARCHAR };
17.
18. protected EnumUserType(Class<E> c) {
19. this.clazz = c;
20. }
21.
22. public int[] sqlTypes() {
23. return SQL_TYPES;
24. }
25.
26. public Class<E> returnedClass() {
27. return clazz;
28. }
29.
30. public Object assemble(Serializable cached, Object owner)
31. throws HibernateException {
32. // TODO Auto-generated method stub
33. return cached;
34. }
35.
36. public Object deepCopy(Object value) throws HibernateException {
37. // TODO Auto-generated method stub
38. return value;
39. }
40.
41. public Serializable disassemble(Object value) throws HibernateException {
42. // TODO Auto-generated method stub
43. return (Serializable) value;
44. }
45.
46. public boolean equals(Object x, Object y) throws HibernateException {
47. // TODO Auto-generated method stub
48. if (x == y)
49. return true;
50. if (null == x || null == y)
51. return true;
52. return x.equals(y);
53. }
54.
55. public int hashCode(Object x) throws HibernateException {
56. // TODO Auto-generated method stub
57. return x.hashCode();
58. }
59.
60. public boolean isMutable() {
61. // TODO Auto-generated method stub
62. return false;
63. }
64.
65. public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner)
66. throws HibernateException, SQLException {
67. // TODO Auto-generated method stub
68.
69. E result = null;
70. if (!resultSet.wasNull()) {
71. String name = resultSet.getString(names[0]).toUpperCase();
72. result = Enum.valueOf(clazz, name);
73. }
74. return result;
75. }
76.
77. public void nullSafeSet(PreparedStatement prepareStatement, Object value,
78. int index) throws HibernateException, SQLException {
79. // TODO Auto-generated method stub
80. if (null == value) {
81. prepareStatement.setNull(index, Types.VARCHAR);
82. } else {
83. prepareStatement.setString(index, ((Enum) value).name());
84. }
85.
86. }
87.
88. public Object replace(Object original, Object target, Object owner)
89. throws HibernateException {
90. // TODO Auto-generated method stub
91. return original;
92. }
93.}
94.



在这里笔者严重提醒大家:

如果你的枚举类里定义的是大写字母,比如:

public static enum Gender {

MALE, FEMALE;

}

那么在String name = resultSet.getString(names[0]).toUpperCase();

这里一定要加上toUpperCase()方法。笔者这里介绍的方法,只适用于enmu里的类型为String类型,若要映射其他类新,可以自己修改。



最后创建一个子类,继承于这个类:



01.public class GenderEnumType extends EnumUserType<Gender> {
02.
03. public GenderEnumType() {
04. super(Gender.class);
05. // TODO Auto-generated constructor stub
06. }
07.}
08.



这样,GenderEnumType就是你在hibernate中定义的可以映射enum的类。



当然要写入**.hbm.xml了:

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package=" ">



<class name="TestVO" table="test">

<id name="id" column="test_id">

<generator class="native" />

</id>

<property name="gender" not-null="true" column="gender"

type="GenderEnumType" />

</class>

</hibernate-mapping>

(注释:包的命名可以自己去改,这里不在解释)。



也许你认为这种方法,是在是太麻烦了,当然了,肯定有好的解决方法:JDK5.0中的annotation的技术。(请关注下会分解)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值