先看一张表:
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的技术。(请关注下会分解)。
分享到:
相关推荐
Hibernate提供了一个专门用于枚举类型映射的类`org.hibernate.type.EnumType`。通过这个类,我们可以选择将枚举实例的`name`或者`ordinal`映射到数据库。具体的配置是在Hibernate的映射文件(通常是.hbm.xml文件)中...
为了解决这些问题,Hibernate3.2引入了`org.hibernate.type.EnumType`,这是一种定制的类型,可以将枚举直接映射到数据库的特定字段,支持多种存储策略。 1. **枚举类型映射的三种策略**: - `ORDINAL`:默认策略...
除了`@Enumerated`,还可以使用第三方库如`org.hibernate.type.EnumType`来更精细地控制枚举映射。例如,我们可以指定使用枚举的某个属性进行映射: ```java import org.hibernate.annotations.Type; import org....
《Hibernate注释与枚举映射详解》 Hibernate作为Java领域中最流行的ORM(对象关系映射)框架之一,极大地简化了数据库操作。本篇将详细探讨`hibernate-annotations-3.4.0.GA`和`hibernate-entitymanager-3.4.0.GA`...
- **@Enumerated(EnumType.STRING)**:指定枚举类型的存储方式。 - **@PrePersist**、**@PreUpdate**、**@PostPersist**、**@PostUpdate**、**@PostLoad**:用于生命周期事件监听,可以实现一些业务逻辑。 #### 四...
### Hibernate注释方法描述数据库映射 #### 一、概述 Hibernate 是一款强大的对象关系映射(ORM)框架,它简化了 Java 开发者与数据库交互的过程。在 Hibernate 中,可以利用注解来描述实体类与数据库表之间的映射...
持久化枚举(Persistent enum)类型 5.2.4. 自定义值类型 5.2.5. 映射到"任意"(any)类型 5.3. SQL中引号包围的标识符 5.4. 映射文件的模块化(Modular mapping files) 6. 集合类(Collections)映射...
【hibernate注解详解】 Hibernate 是一个流行的Java ORM(对象关系映射)框架,它允许开发者使用面向对象的方式操作数据库。在Hibernate中,注解是声明对象与数据库表之间映射关系的主要方式。以下是对描述中提到的...
### Hibernate注解详解 #### 一、实体Bean与基本注解 **实体Bean**是Hibernate框架中的核心概念之一,指的是那些被持久化的Java对象。在Hibernate中,通过使用`@Entity`注解来标记某个Java类,使其成为实体Bean。 ...
在Java世界中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库。本文将详细解析Hibernate中的注解使用,帮助理解如何通过注解简化数据库操作。 首先,实体Bean是...
- **持久化枚举(Persistent enum)类型**:枚举类型的映射策略。 - **自定义值类型**:用户定义的复杂数据类型的映射。 - **映射到"任意"(any)类型**:一种特殊的数据类型映射方式,用于存储任意类型的对象。 -...
对于枚举类型,`@Enumerated(EnumType.STRING)`或`@Enumerated(EnumType.ORDINAL)`可以帮助我们以字符串或数值方式存储枚举。 关于主键生成策略,Hibernate提供了多种选择。例如,`@GeneratedValue(strategy=...
【Hibernate注解详解】 在Java世界中,Hibernate作为一款强大的对象关系映射(ORM)框架,使得开发者可以方便地在Java对象与数据库表之间建立映射。为了简化配置,Hibernate引入了注解机制,允许开发者在Java类和类...
Java JDBC(Java Database Connectivity)是Java编程语言与各种数据库交互的一种标准接口,它允许Java开发者在应用程序中执行SQL...在实际项目中,还可以考虑使用ORM框架如Hibernate或MyBatis,进一步简化数据库操作。
### Hibernate Annotation 使用手册详解 #### 一、概述 Hibernate 是一款非常流行的 ORM(Object Relational Mapping)框架,它能够简化 Java 应用程序与数据库之间的交互。为了更好地使用 Hibernate 进行开发,...
Hibernate Types存储库为您提供了Hibernate ORM核心不支持的其他类型和通用实用程序。 该项目的主要优点是它支持从Hibernate 4.1到Hibernate 5.4的各种Hibernate版本。 产品特点 JSON格式 最佳实践 将JSON列类型...
@MapKeyEnumerated(EnumType.STRING) private Map, ContactInfo> contacts; } ``` ContactType是枚举类型,作为Map的键,ContactInfo是另一个实体类,作为值。`@ElementCollection`用于表示这是实体类的一个集合...
持久化枚举(Persistent enum)类型 5.2.4. 自定义值类型 5.2.5. 映射到"任意"(any)类型 5.3. SQL中引号包围的标识符 5.4. 映射文件的模块化(Modular mapping files) 6. 集合类(Collections)映射...