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

Hibernate对自定义类型CompositeUserType的用法

阅读更多

使用CompositeUserType和使用UserType一样,但CompositeUserType多了HQL的查询支持,并相对比较复杂,一般使用UserType就足够了

使用UserType参考http://blog.csdn.net/daryl715/archive/2007/12/10/1927502.aspx 

下面给出UserType不同的AddressType和测试代码:

 


package Search.CompositeUserType;

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.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.engine.SessionImplementor;
import org.hibernate.type.Type;
import org.hibernate.usertype.CompositeUserType;
import org.hibernate.usertype.UserType;


public class AddressType implements CompositeUserType, Serializable ...{

    
private String homeAddr;
    
private String workAddr;


 
    
/**//*获得属性名数组,属性名可用于进行HQL查询  */
    
public String[] getPropertyNames() ...{
        
return new String[] ..."homeAddr""schoolAddr" };
    }


    
/**//*获得对应的属性类型,必须和属性名数组元素的顺序相对应  */
    
public Type[] getPropertyTypes() ...{
        
return new Type[] ...{ Hibernate.STRING, Hibernate.STRING };
    }


    
/**//*通过index取得对象的属性值,index从0开始,顺序和配置文件中定义属性的顺序一致   */
    
public Object getPropertyValue(Object component, int property)
            
throws HibernateException ...{
        AddressType address 
= (AddressType) component;
        
if (property == 0)
            
return address.getHomeAddr();
        
else
            
return address.getWorkAddr();
    }


    
/**//*根据index设置对象属性  */
    
public void setPropertyValue(Object component, int property, Object value)
            
throws HibernateException ...{
        AddressType address 
= (AddressType) component;
        String add_value 
= (String)value;
        
if (property == 0)
            address.setHomeAddr(add_value);
        
else
            address.setWorkAddr(add_value);
        

    }


    
/**//*返回对应的映射类*/
    
public Class returnedClass() ...{
        
return AddressType.class;
    }


    
/**//* 两个对象是否相等,使用了apache的common工具包来进行属性比对 */
    
public boolean equals(Object x, Object y) throws HibernateException ...{
        
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,
            SessionImplementor session, Object owner)
            
throws HibernateException, SQLException ...{
        
if (rs.wasNull())
            
return null;
        String homeAddr 
= rs.getString(names[0]);
        String schoolAddr 
= rs.getString(names[1]);
        AddressType address 
= new AddressType(homeAddr, schoolAddr);
        
return address;
    }


    
/**//* 保存数据,index的顺序按照映射文件定义的顺序,从0开始。 */ 
    
public void nullSafeSet(PreparedStatement st, Object value, int index,
            SessionImplementor session) 
throws HibernateException, SQLException ...{
        AddressType address 
= (AddressType) value;
        
if (value == null...{
              st.setNull(index, Types.VARCHAR);
              st.setNull(index
+1, Types.VARCHAR);
        }
 else ...{
            st.setString(index, address.getHomeAddr());
            st.setString(index 
+ 1, address.getWorkAddr());
        }

         System.out.println(
"Data has been saved! ");

    }


    
/**//*完整拷贝一个对象,而不是直接返回它的引用     */
    
public Object deepCopy(Object value) throws HibernateException ...{
        
if (value == null)
            
return null;
        AddressType address 
= (AddressType) value;
        
return new AddressType(address.getHomeAddr(), address.getWorkAddr());
    }


    
/**//*设置类可变,可以通过属性的set方法改变属性值*/
    
public boolean isMutable() ...{
         
return true;
    }

    
/**//* 当把AddressType类型数据写入二级缓存时,此方法被调用 */
    
public Serializable disassemble(Object value, SessionImplementor session)
            
throws HibernateException ...{
        
return (Serializable) deepCopy(value);
    }


分享到:
评论

相关推荐

    Hibernate使用——自定义数据类型

    在实际项目开发中,有时我们可能需要对数据库中的某些字段使用自定义的数据类型,以更好地符合业务需求。本篇文章将深入探讨如何在Hibernate中实现自定义数据类型。 首先,我们需要理解Hibernate是如何处理数据类型...

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

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

    hibernate + 自定义标签分页

    在实际应用中,通常在后台Controller层(对应Struts的Action),通过Hibernate查询数据库获取数据时,会调用`PagerHelper` 来创建`Pager` 对象,然后在JSP页面中,使用自定义的`<pageTag>` 标签来展示分页信息和...

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

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

    hibernate自定义查询

    Hibernate支持使用`createSQLQuery`方法创建SQL查询,并返回结果集。例如: ```java Session session = sessionFactory.openSession(); SQLQuery sqlQuery = session.createSQLQuery("SELECT * FROM USER WHERE ...

    Hibernate Validation自定义注解校验的实现

    Hibernate Validation自定义注解校验的实现是指在Hibernate Validation框架中,使用自定义的注解来实现特定的校验逻辑。在本文中,我们将通过示例代码,详细地介绍如何实现自定义注解校验。 首先,我们需要了解...

    Struts+Hibernate+自定义标签的网上书店

    **Struts、Hibernate和自定义标签在构建网上书店系统中的应用** 本网上书店系统是一个基于MVC(Model-View-Controller)设计模式的Web应用程序,它整合了Java的两大核心框架——Struts和Hibernate,以及自定义标签...

    JAVA数据类型与Hibernate的类型映射

    在Java编程语言中,...这涉及到对Java基本类型、复杂类型以及自定义对象的映射,还包括对数据库NULL值的处理、对象关系映射以及工具的使用策略。熟悉这些知识,可以帮助开发者更高效地利用Hibernate进行数据持久化。

    解决Hibernate对于Date类型的数据返回结果中时分秒不对的问题

    在使用Hibernate进行数据库操作时,有时会遇到一个常见的问题,即当从数据库中查询Date类型的数据并由Hibernate返回时,发现结果中的时分秒部分不正确。这个问题通常源于多个因素,包括日期时间的序列化与反序列化...

    hibernate 调用oracle函数

    4. **定义Hibernate Native SQL查询**:由于Hibernate默认不支持调用存储过程或函数,我们需要使用`@NamedNativeQuery`或`@SqlResultSetMapping`注解来定义一个原生SQL查询,用于调用Oracle函数。例如: ```java @...

    hibernate映射Oracle中LONG类型

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

    hibernate对Blob类型字段进行数据添加.txt

    本文档将详细介绍如何使用 Hibernate 对 Blob 类型字段进行数据添加的过程,并通过实际代码示例来展示具体的操作步骤。 #### Hibernate Blob 数据处理原理 在 Hibernate 中,Blob 类型的字段通常被映射为 `java....

    Hibernate各种主键生成策略与配置详解

    关于Hibernate的各种主键生成策略与配置详解

    邮箱(hibernate+Servlet+自定义标签,内带hibernate配置,自定义标签分页)

    标题和描述中提到的"邮箱(hibernate+Servlet+自定义标签,内带hibernate配置,自定义标签分页)"是一个基于Java技术栈的Web应用项目,它利用Hibernate作为持久层框架,Servlet作为控制层,以及自定义标签来实现前端展示...

    hibernate和java类型转换

    hibernate和java类型转换,hibernate和java类型转换

    hibernate映射枚举类型

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

    Java数据类型,Hibernate数据类型,标准sql数据类型之间的对应表

    此外,Hibernate还支持自定义数据类型的映射,允许开发者根据需求扩展和定制。 在实际开发中,理解这些映射关系至关重要,因为它直接影响到数据的存储和查询效率,以及数据的一致性和完整性。例如,如果错误地将...

    自定义 Hibernate Tools 的模板

    **自定义 Hibernate Tools 模板**是针对 Eclipse 开发环境中的 Hibernate 工具集进行的一种扩展,目的是在使用 Hibernate 逆向工程(Reverse Engineering)生成实体类时,能够根据数据库中的注释自动添加对应的注释...

    java+hibernate+jsp+tld+自定义标签分页

    1. **创建自定义标签**: 编写一个Java类作为自定义标签的实现,这个类需要继承自`javax.servlet.jsp.tagext.TagSupport`或`javax.servlet.jsp.tagext.SimpleTagSupport`,并覆盖其中的方法来处理分页逻辑。...

    扩展Hibernate使用自定义数据库连接池的方法

    然而,当涉及到多模块整合或已有自定义数据库连接池时,可能需要扩展Hibernate以使用自定义的数据库连接池。本文将详细讲解如何实现这一过程。 首先,Hibernate通过`ConnectionProvider`接口来管理数据库连接。这个...

Global site tag (gtag.js) - Google Analytics