`

hibernate中处理枚举类型

阅读更多
先看一张表:

Create table test(

Test_id integer not null auto_increment,

gender Enum(MALE, FEMALE)

)



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





public final class TestVO {

    private Integer id;

public static enum Gender {
        MALE, FEMALE;
    }
    private Gender gender;


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }   
    

    public Gender getGender() {
        return gender;
    }

    public void setGender(Gender gender) {
        this.gender = gender;
    }

}

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

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





创建一个自己的EnumUserType:

import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;

import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;
import org.apache.log4j.*;

public class EnumUserType<E extends Enum<E>> implements UserType {
    private Logger log = Logger.getLogger(EnumUserType.class);

    private Class<E> clazz = null;

    private static final int[] SQL_TYPES = { Types.VARCHAR };

    protected EnumUserType(Class<E> c) {
        this.clazz = c;
    }

    public int[] sqlTypes() {
        return SQL_TYPES;
    }

    public Class<E> returnedClass() {
        return clazz;
    }

    public Object assemble(Serializable cached, Object owner)
            throws HibernateException {
        // TODO Auto-generated method stub
        return cached;
    }

    public Object deepCopy(Object value) throws HibernateException {
        // TODO Auto-generated method stub
        return value;
    }

    public Serializable disassemble(Object value) throws HibernateException {
        // TODO Auto-generated method stub
        return (Serializable) value;
    }

    public boolean equals(Object x, Object y) throws HibernateException {
        // TODO Auto-generated method stub
        if (x == y)
            return true;
        if (null == x || null == y)
            return true;
        return x.equals(y);
    }

    public int hashCode(Object x) throws HibernateException {
        // TODO Auto-generated method stub
        return x.hashCode();
    }

    public boolean isMutable() {
        // TODO Auto-generated method stub
        return false;
    }

    public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner)
            throws HibernateException, SQLException {
        // TODO Auto-generated method stub

        E result = null;
        if (!resultSet.wasNull()) {
            String name = resultSet.getString(names[0]).toUpperCase();
            result = Enum.valueOf(clazz, name);
        }
        return result;
    }

    public void nullSafeSet(PreparedStatement prepareStatement, Object value,
            int index) throws HibernateException, SQLException {
        // TODO Auto-generated method stub
        if (null == value) {
            prepareStatement.setNull(index, Types.VARCHAR);
        } else {
            prepareStatement.setString(index, ((Enum) value).name());
        }

    }

    public Object replace(Object original, Object target, Object owner)
            throws HibernateException {
        // TODO Auto-generated method stub
        return original;
    }
}



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

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

public static enum Gender {

        MALE, FEMALE;

    }

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

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



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



public class GenderEnumType extends EnumUserType<Gender> {

    public GenderEnumType() {
        super(Gender.class);
        // TODO Auto-generated constructor stub
    }
}



这样,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的技术。(请关注下会分解)。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/76ersjy2/archive/2009/01/10/3747356.aspx
分享到:
评论

相关推荐

    hibernate映射枚举类型

    Hibernate,作为Java中广泛使用的对象关系映射(ORM)框架,提供了一种优雅的方式来映射枚举类型到数据库。本文将深入探讨Hibernate如何映射枚举类型,并给出实际应用示例。 ### Hibernate枚举映射方式 #### 1. `@...

    Hibernate中映射枚举类型

    例如,如果枚举类型中有`MALE`、`FEMALE`两个值,那么可以定义一个`getKey()`方法来返回`"male"`和`"female"`。 2. **解析Getter方法**:在`setParameterValues`方法中,解析`&lt;param name="key"&gt;key&lt;/param&gt;`配置项...

    JSP 中Hibernate实现映射枚举类型

    在Java的Hibernate框架中,处理枚举类型与数据库之间的映射是一项常见需求。JSP中实现Hibernate映射枚举类型是将Java中的枚举类型映射到数据库中的特定格式,通常是为了保持数据的一致性以及便于管理。本文将详细...

    springboot项目中枚举类型的最佳实践

    其次,对于数据库操作,枚举类型可以用于ORM框架如Hibernate的实体属性。在持久化枚举到数据库时,通常将枚举的`ordinal()`值或自定义的code映射到数据库字段,以避免枚举值更改导致的数据不一致。例如,我们可以在...

    hibernate使用中与各种数据库字段类型对应类型训练

    9. **枚举类型**:在数据库中可以使用CHAR或INT存储,Hibernate通过`@Enumerated`注解支持枚举类型映射。 在实际应用中,我们还需要关注以下几点: - **级联操作**:如CascadeType.PERSIST、CascadeType.MERGE等,...

    Hibernate3.2EnumTypeMapping-demo.zip

    在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作与业务逻辑层解耦,提高代码的可...这将帮助你更好地利用Hibernate处理枚举类型,提高代码质量,减少潜在的运行时错误。

    Hibernate中文参考手册

    - **复杂类型映射**: 包括集合、枚举等复杂类型的映射处理。 - **一对一、一对多、多对多关系映射**: 分别介绍了不同关系类型下的映射策略及其应用场景。 - **继承映射**: 支持单表、联合表等多种继承映射模式,适用...

    hibernate基础jar包

    9. 类型转换:Hibernate提供了一些自定义类型,比如日期时间类型、枚举类型等,使得Java对象可以更好地映射到数据库字段。 10. 其他依赖:为了功能完整,基础包可能还包含其他依赖,如JAXB用于XML序列化,或者DOM4J...

    hibernate javadoc 4.2.1

    11. **类型系统**:Hibernate提供了一套丰富的类型系统,包括基本类型和用户自定义类型,如日期时间类型、枚举类型等。 在使用`Hibernate-javadoc4.2.1.chm`文件时,开发者可以通过查阅其中的类、接口和方法的详细...

    HibernateAPI html 英文版

    在Hibernate中,枚举可以用于映射数据库中的枚举类型字段,简化代码并提高可读性。 2. **Autoboxing and Unboxing.txt** - 自动装箱与拆箱是Java中的一项特性,允许基本类型与对应的包装类之间无缝转换。在...

    hibernate jar包和dtd

    而“dtd”是指文档类型定义(Document Type Definition),在Hibernate中,DTD文件用于定义XML配置文件的结构和约束。例如,`hibernate-configuration-5.0.dtd`定义了`hibernate.cfg.xml`的结构,包含数据库连接信息...

    hibernate5.2.12All.jar

    6. **类型系统**:Hibernate 5.2.12版本中,引入了更丰富的类型系统,如日期时间类型、枚举类型等,增强了对Java 8特性的支持。 7. **连接池**:Hibernate可以通过集成C3P0、DBCP等连接池,有效管理数据库连接,...

    hibernate3.5中文文档

    11. **自定义类型**:讲解如何扩展Hibernate以支持自定义数据类型,如日期时间格式、枚举类型等。 12. **性能优化**:提供了一些最佳实践和技巧,如批处理、延迟加载、预加载等,以提高Hibernate应用的性能。 13. ...

    hibernate 中的 set map list 代码

    本主题主要聚焦于如何利用Hibernate处理集合类型的属性,包括Set、List和Map。这些集合类型的映射允许我们在一个实体类中存储多个相关联的数据项,从而实现一对多或多对多的关系。 首先,Set是不包含重复元素的集合...

    hibernate-src.zip源代码包

    4. **org.hibernate.type** 包:这里包含了各种Hibernate自定义类型,如日期时间类型、枚举类型等,它们将Java对象转换为数据库可识别的数据类型。 5. **org.hibernate.persister** 包:持久化相关的类,如`...

    Hibernate3.2整套源码

    4. **类型系统增强**:增加了对枚举类型的支持,以及更加灵活的类型转换机制。 5. **JPA支持**:Hibernate 3.2开始支持Java Persistence API(JPA),使得那些希望遵循JPA标准的开发者也能使用Hibernate。 6. **...

    Hibernate实战(第2版 中文高清版)

     10.1.2 Hibernate应用程序中的事务   10.1.3 使用Java Persistence的事务   10.2 控制并发访问   10.2.1 理解数据库级并发   10.2.2 乐观并发控制   10.2.3 获得额外的隔离性保证   10.3 非事务数据...

    hibernate5.3 jar包

    5. **Type系统**:引入了更强大的类型系统,包括对Java 8日期时间API的原生支持,以及对枚举、数组和集合的更灵活处理。 6. **工具与API**:提供了更完善的API和工具,如hibernate-tools,用于生成数据库脚本,反向...

    hibernate-annotations-3.4.0.GA

    Hibernate是Java领域中广泛应用的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。而Hibernate Annotations是Hibernate框架的一个重要组成部分,它引入了基于注解...

Global site tag (gtag.js) - Google Analytics