`

Hibernate使用UserType

阅读更多
Hibernate有很多值得学习的地方,这里我们主要介绍Hibernate使用UserType,包括介绍UserType就是用户自定义类型等方面。

1、建立数据库的时候最好建立一个跟业务逻辑完全没有关系的id,这样的好处就是以后当数据量大的时候可以容易的建立索引,而且当业务逻辑变化的时候底层的数据结构不用变化很大。

2、代码的干净是非常非常的重要的,从现在开始尽量让自己的代码写的漂亮把!因为干净的代码不仅容易维护,而且容易发现bug,在Hibernate使用UserType是很好用的。举个经典的例子:

实现Hibernate使用UserType接口的email 类

比如 你需要在 TUSER 表中记录一个人的 email ,单独为其建立一张数据库表是很浪费资源的,一般的方法是将TUSER 一栏 varchar 的来记录email ,多个 email 之间用 " ; "号分开,我曾经做的项目中采取的方法是:取出一个记录着多条 email 的 string然后再来用 ; 号拆开,但是这样子就有个不好,在一堆整齐的 get 方法用出来一个有 bad smell 的代码。

有两个方法,一个是修改映射TUSER的 java 类在其中增加一个 getEmail 方法,返回一个 list ,该方法对原先的 getEmail 方法进行二次处理。第二个方法就是采用UserType 。

UserType就是用户自定义类型,这里的类型指的是除了Hibernate定义的那些类型之外的用户自己定义的。

一个实现Hibernate使用UserType接口的 email 类如下(里面的每个方法都是必须实现的接口方法,许多都可以复制粘贴的,不复杂):

    public class Email implements UserType 
    ...{ 
    
    // 表示本类型实例是否可变,一般是不可变 
    public boolean isMutable() 
    ...{ 
    return false; 
    } 
    
    //该类型对应的 sql 类型 
    public int[] sqlTypes() 
    ...{ 
    return new int[]......{Types.VARCHAR}; 
    } 
    
    // 改类型对应的 java 类型 
    public Class returnedClass() 
    ...{ 
    return List.class; 
    } 
    
    // 完全复制的方法,由于是用户自己定义的类型
    //所以hibernate并不知道要如何来复制这个类,需要用户自己定义 
    public Object deepCopy(Object value)throws HibernateException 
    ...{ 
    List source = (List)value; 
    List target = new ArrayList(); 
    target.addAll(source); 
    return target; 
    } 
    
    //equals方法,这个就不用多说了吧,肯定是要用户自定义的 
    public boolean equals(Object x,Object y) throws HibernateException 
    ...{ 
    //这部分不写出来了,自己实现吧,这个不是我要讲的重点 
    } 
    
    /** *//**//* 
    这才是重头戏!nullSafeGet 和nullSafeSet 是核心所在,对数据的后期处理都在这两个方法里面 
    nullSafeGet 是读取的方法 
    owner 目前没用到过。 
    names 是对应的数据库列名,UserType是可以对应多个列的 
    */ 
    public Object nullSafeGet(ResultSet rs,String[] names,Object owner)
    throws HibernateException,SQLException 
    ...{ 
    String value = (String)Hibernate.STRING.nullSafeGet(rs,names[0]); 
    if(value != null) 
    ...{ 
    //把 string 拆开成 list 的代码放在这里 
    } 
    return resultList;//得到了拆开的 邮件列表 
    } 
    
    /**//* 
    保存的方法 
    index 是那个 PreparedStatement 的参数序号,一般来说不用管直接往下传 
    value 就是要保存的数据,在这边是一个保存着 email 列表的 List 
    */ 
    public void nullSafeSet(PreparedStatement st,Object value,int index)
    throws HibernateException,SQLException 
    ...{ 
    if(value != null) 
    ...{ 
    String email = assemble(value);//将 List 拼合成 String 的 Email 的方法 
    Hibernate.STRING.nullSafeSet(st,email,index); 
    } 
    else 
    ...{ 
    Hibernate.STRING.nullSafeSet(st,value,index); 
    } 
    } 
    }

在TUser.hbm.xml 中如此设置:

    <hibernate-mapping>
    <class name="entity.TUser" table="T_USER">
    </class>
    .............. 
    <property name = "emali"column = "email"type = "mytype.Email"/>
    </hibernate-mapping>

在TUser.java中如此设置

    public class TUser implement Serializable 
    ...{ 
    private Integer id; 
    privarte Stirng name; 
    //看,这边的 email 可以大胆的使用 List 了 
    private List email; 
    
    //下面是一些 getter 和 setter 了 
    }

这样设置后你使用 TUser的时候要取出  email 直接 getEmail 出来的就是一个List 了,而且前台根本不知道后台干了什么,这样代码就简洁多了。
转自:http://developer.51cto.com/art/200909/154162.htm
分享到:
评论

相关推荐

    J2EE企业级项目开发-1期 04 Hibernate使用经验.doc

    在Hibernate中,使用`UserType`可以提升代码质量。`UserType`允许我们自定义数据类型的映射,以便更好地适应特定业务需求。 3. **自定义UserType实例**:例如,如果我们需要在`TUSER`表中存储用户的电子邮件,但不...

    hibernate4.1中文api

    - **使用org.hibernate.usertype.UserType**: 实现自定义用户类型。 - **使用org.hibernate.usertype.CompositeUserType**: 映射复合类型。 - **类型注册**: 注册自定义类型。 #### 7. 集合映射 - **持久化集合*...

    Hibernate3.2EnumTypeMapping-demo.zip

    - `TYPE`:自定义类型映射,需要实现`org.hibernate.usertype.UserType`接口,可以自定义存储和读取的逻辑。 2. **配置枚举类型映射**: 在Hibernate的映射文件(.hbm.xml)中,可以使用`&lt;typedef&gt;`元素定义枚举...

    hibernate需要的jar包们

    在使用Hibernate时,确保正确配置并包含必要的JAR(Java Archive)文件至关重要,因为这些库提供了框架运行所需的功能。下面我们将详细探讨Hibernate所需的JAR包及其作用。 1. **hibernate-core.jar**:这是...

    hibernate(api 介绍).docx

    1. org.hibernate.usertype.UserType:可以自定义数据映射类型。 2. org.hibernate.dialect.Dialect abstract_class:Hibernate 对于每种数据库都定义了独有的方言,比如 Oracle、MSSQL、Sybase 等数据库系统都有...

    Hibernate 配置跟数据库字段的对应关系

    在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库,而无需关心底层SQL语句。本文将深入探讨如何在Hibernate配置中设置与数据库字段的对应关系,以及...

    用Hibernate实现领域对象的自定义字段

    本文将深入探讨如何使用Hibernate实现领域对象的自定义字段,这涉及到对Hibernate核心概念的理解以及自定义类型的应用。 首先,我们需要了解Hibernate的核心概念。Hibernate主要通过配置文件(hibernate.cfg.xml)...

    hibernate映射Oracle中LONG类型

    在 Hibernate 框架中,使用自定义类型映射 Oracle 中的 LONG 类型字段是一种常见的解决方案。通过实现 UserType 接口,我们可以定制 LONG 类型字段的读写操作。在本例中,我们定义了一个名为 CustomLong 的类,该类...

    mysql 让hibernate支持text字段的方言

    - 如果使用的是HBM(Hibernate Mapping)文件,需要在对应字段上配置`type`属性,指向自定义的`UserType`全限定类名。 通过以上步骤,你可以确保Hibernate在处理MySQL的`TEXT`字段时能够正确地进行序列化、反序列...

    hibernate(api_介绍)

    Hibernate 是一个强大的 Java 持久化框架,它简化了数据库与对象之间的交互。通过提供一组丰富的API,Hibernate使得开发者能够在应用中轻松地管理和操作数据库数据。...理解并熟练使用这些接口是掌握Hibernate的关键。

    动态添加hibernate domain的属性的例子

    这通常通过实现`org.hibernate.usertype.UserType`接口来完成,该接口定义了将Java类型转换为数据库类型的逻辑。 以下是一些关键步骤: 1. **创建动态扩展的基类**:定义一个基类,它继承自Hibernate的`...

    Hibernate4实战 之第七部分

    当需要持久化某些来自第三方库的Java类型时,如果这些类型没有提供适当的getter和setter方法,可以考虑实现`org.hibernate.UserType`接口来定义自定义类型。这样可以在不修改原有类的情况下完成持久化任务。 #### ...

    简要分析Java的Hibernate框架中的自定义类型

    使用自定义类型时,你需要在实体类的属性上使用`@Type`注解,指定自定义类型的实现类,使得Hibernate在操作这些属性时能够调用我们定义的转换逻辑。 例如,如果你有一个自定义日期时间类型,可以这样使用: ```java...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     11.1.5 使用Hibernate内置映射类型  11.2 客户化映射类型  11.2.1 用客户化映射类型取代Hibernate组件  11.2.2 用UserType映射枚举类型  11.2.3 实现CompositeUserType接口  11.2.4 运行本节范例程序  11.3 ...

    hibernate3.2API

    **hibernate 帮助文档**是学习和使用Hibernate框架的关键资源,其中包含了详尽的API参考、示例代码和教程。通过这份文档,开发者可以了解到如何配置Hibernate,如何创建和管理实体类,以及如何执行CRUD(创建、读取...

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

     2.2.2 使用Hibernate EntityManager   2.2.3 引入EJB组件   2.2.4 切换到Hibernate接口   2.3 反向工程遗留数据库   2.3.1 创建数据库配置   2.3.2 定制反向工程   2.3.3 生成Java源代码   2.4 与...

    马士兵hibernate学习笔记

    - **自定义数据类型**:通过实现 `org.hibernate.usertype.UserType` 接口来自定义数据类型。 通过以上内容的学习,可以全面理解 Hibernate 的基本原理和使用方法,掌握其核心概念和技术要点,从而能够有效地利用 ...

    Hibernate的char问题.txt

    为了更精确地控制 `char` 类型的处理方式,可以考虑使用 Hibernate 提供的自定义类型,比如 `CharacterType` 或者自定义实现 `org.hibernate.usertype.UserType` 接口来创建自定义的类型转换器。 ##### 3. 参数绑定...

    Hibernate API Documentation (3.2)

    10. **类型转换**:Hibernate提供UserType接口,允许自定义Java类型与数据库类型的转换,处理非标准或复杂类型的持久化。 11. **事件监听器**:通过实现特定接口,如PreInsertEventListener,可以监听并干预对象...

Global site tag (gtag.js) - Google Analytics