`
esffor
  • 浏览: 1370750 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate对自定义类型UserType的用法

阅读更多

Hibernate允许我们自定义映射属性的类型,比如一个学生有联系地址,而联系地址又分为家庭地址和工作地址,我们可以把两个地址信息抽象成一个新的Address类,作为Student的成员变量

数据库结构:

 

create table typestu (id varchar(32primary key,name varchar(32),homeaddr varchar(32),workaddr varchar(32));

Hibernate.cfg.xml

 

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
>

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

<session-factory>
    
<property name="connection.username">root</property>
    
<property name="connection.url">
        jdbc:mysql://localhost:3306/schoolproject?characterEncoding=gb2312
&amp;useUnicode=true
    
</property>
    
<property name="dialect">
        org.hibernate.dialect.MySQLDialect
    
</property>
    
<property name="myeclipse.connection.profile">mysql</property>
    
<property name="connection.password">1234</property>
    
<property name="connection.driver_class">
        com.mysql.jdbc.Driver
    
</property>
    
<property name="hibernate.dialect">
        org.hibernate.dialect.MySQLDialect
    
</property>
    
<property name="hibernate.show_sql">true</property>
    
<property name="current_session_context_class">thread</property>
    
<mapping resource="Search/UserType/Student.hbm.xml" />

</session-factory>

</hibernate-configuration>

 Pojo

 

package Search.UserType;


public class Student ...{
    
private String id; //标识id
    private String name; //学生姓名
    private AddressType address;//地址
    public String getId() ...{
        
return id;
    }

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

    
public String getName() ...{
        
return name;
    }

    
public void setName(String name) ...{
        
this.name = name;
    }

    
public AddressType getAddress() ...{
        
return address;
    }

    
public void setAddress(AddressType address) ...{
        
this.address = address;
    }


 
 
 
}

 

自定义类型

 


package Search.UserType;

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

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;

public class AddressType implements UserType, Serializable ...{
    
private String homeAddr;
    
private String workAddr;

    
/**//* 有几个字段就有几个值,这里容易出错,要多注意 */
    
private static final int[] SQL_TYPES = ...{ Types.VARCHAR, Types.VARCHAR };

    
/**//* 这个方法告诉Hibernate在成生DDL时对列采用什么样的SQL语法 */
    
public int[] sqlTypes() ...{
        
return SQL_TYPES;
    }


    
/**//*
     * Hibernate返回什么样的映射类型,与 <property name="address" type="model.AddressType">
     * 指定的类一致。事实上也可以把AddressType拆分为两个类,一个类是只携带信息的JavaBean,它里面
     * 没有逻辑操作也没有实现UserType(比如AddressBean);而另一个类实现了UserType,它所面对的就不是现在这个
     * AddressType类的homeAddr和homeAddr属性,它面对的是AddressBean。在本例中为了简洁方便,只用了一个类。
     
*/

    
public Class returnedClass() ...{
        
return AddressType.class;
    }


    
/**//*
     * 表明这个类的实例在创建以后就不可以改变属性。Hibernate能为不可改变的类作一些性能优化。
     
*/

    
public boolean isMutable() ...{
        
return false;
    }


    
/**//*
     * 由于AddressType是不可变的,所以深拷贝可以直接返回对象引用。拷贝的对象由应用程序使用, 而原版对象由Hibernate维护以做脏数据检查
     
*/

    
public Object deepCopy(Object value) ...{
        
return value; // Address is immutable
    }


    
/**//* 两个对象是否相等,使用了apache的common工具包来进行属性比对 */
    
public boolean equals(Object x, Object y) ...{
        
if (x == y)
            
return true;
        
if (x == null || y == null)
            
return false;
        AddressType add1 
= (AddressType) x;
        AddressType add2 
= (AddressType) y;
        
return new EqualsBuilder() //使用EqualsBuilder类来方便地进行比对
                .append(add1.getHomeAddr(), add2.getHomeAddr()).append(
                        add2.getWorkAddr(), add2.getWorkAddr()).isEquals();
    }


    
/**//* 得到hash码 */

    
public int hashCode(Object x) throws HibernateException ...{
        AddressType address 
= (AddressType) x;
        
return new HashCodeBuilder()//使用HashCodeBuilder类来方便地进行比对
                .append(address.getHomeAddr()).append(address.getWorkAddr())
                .toHashCode();
    }


    
/**//* 读取数据并组装成一个AddressType对象。names[]中的参数顺序依照映射文件中定义的顺序 */
    
public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
            
throws HibernateException, SQLException ...{
        
if (rs.wasNull())
            
return null;
        String homeAddr 
= rs.getString(names[0]);
        String schoolAddr 
= rs.getString(names[1]);
        AddressType address 
= 
分享到:
评论

相关推荐

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

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

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

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

    hibernate映射Oracle中LONG类型

    使用自定义类型映射 Oracle 中的 LONG 类型字段是解决 Hibernate 框架中 LONG 类型字段读写问题的一种有效方法。通过实现 UserType 接口,我们可以定制 LONG 类型字段的读写操作,并提高 Hibernate 框架的灵活性和可...

    mysql 让hibernate支持text字段的方言

    例如,可以创建一个自定义的`UserType`实现,覆盖`sqlTypes()`方法,返回`TEXT`字段对应的SQL类型代码(如` Types.LONGVARCHAR`),并在`returnedClass()`方法中指定返回的Java类型(如`String`)。 3. **配置...

    Hibernate3.2EnumTypeMapping-demo.zip

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

    hibernate 杂谈

    4. **Hibernate自定义类型** Hibernate允许开发者自定义数据类型,将复杂对象如集合转化为字符串存储。这通常涉及到实现`UserType`接口,覆盖其中的方法如`sqlTypes()`、`returnedClass()`等。自定义类型可以用于...

    hibernate4.1中文api

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

    Hibernate的char问题.txt

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

    hibernate-json:Json 用户类型Hibernate

    本文将深入探讨Hibernate对JSON的支持,特别是如何构建自定义的JSON用户类型,以便于在Hibernate中存储和查询JSON数据。 首先,让我们了解JSON在现代应用中的角色。JSON(JavaScript Object Notation)是一种轻量级...

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

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

    JSP 中Hibernate实现映射枚举类型

    本文将详细介绍如何在Hibernate中实现枚举类型到数据库的映射,包括对应的枚举类的定义、自定义UserType以及在映射文件hbm.xml中的配置。 首先,定义一个枚举类型Gender,它包含了性别相关的几个枚举值,分别是...

    hibernate3中文手册

    《Hibernate3中文手册》是Java开发领域中关于对象关系映射框架Hibernate的重要参考资料,它详尽地阐述了Hibernate3的使用方法和核心概念。Hibernate是一个开放源代码的对象关系映射框架,它允许开发者将数据库操作与...

    hibernate3.2API

    7. **类型转换**:`UserType`和`CompositeUserType`接口允许自定义Java类型与数据库类型的转换。 8. **元数据获取**:`ClassMetadata`和`SessionFactoryMetadata`等接口提供了获取关于实体类和整个SessionFactory的...

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

    3. **自定义UserType实例**:例如,如果我们需要在`TUSER`表中存储用户的电子邮件,但不想为每个邮箱创建单独的记录,可以使用`UserType`将多个邮箱地址存储在一个`VARCHAR`字段内,以分号分隔。自定义的`Email`类...

    Hibernate4实战 之第七部分

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

    Hibernate源代码项目

    例如,通过实现` UserType`接口可以扩展Hibernate对特定数据类型的处理能力。 8. **性能优化**: 深入源代码,我们可以了解Hibernate的延迟加载(Lazy Loading)、批处理(Batch Processing)等性能优化策略,这些...

    马士兵hibernate学习笔记

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

    hiber开发指南 hibernate高级特性

    Hibernate允许开发者定义自己的类型,通过实现`UserType`接口,可以处理自定义的数据类型。此外,`HibernateTypeConverter`可以用于字段在Java类型和数据库类型之间的转换。 11. **性能优化** 优化包括但不限于:...

    Hibernate识别数据库特有字段实例详解

    UserType接口要求实现者提供一系列的方法来定义自定义数据类型的行为,包括对象的序列化和反序列化、深拷贝、对象比较、散列值计算、是否可变以及如何在Java对象和数据库之间进行类型转换等。通过这种方式,我们可以...

Global site tag (gtag.js) - Google Analytics