使用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是如何处理数据类型...
使用自定义类型时,你需要在实体类的属性上使用`@Type`注解,指定自定义类型的实现类,使得Hibernate在操作这些属性时能够调用我们定义的转换逻辑。 例如,如果你有一个自定义日期时间类型,可以这样使用: ```java...
在实际应用中,通常在后台Controller层(对应Struts的Action),通过Hibernate查询数据库获取数据时,会调用`PagerHelper` 来创建`Pager` 对象,然后在JSP页面中,使用自定义的`<pageTag>` 标签来展示分页信息和...
本文将深入探讨如何使用Hibernate实现领域对象的自定义字段,这涉及到对Hibernate核心概念的理解以及自定义类型的应用。 首先,我们需要了解Hibernate的核心概念。Hibernate主要通过配置文件(hibernate.cfg.xml)...
Hibernate支持使用`createSQLQuery`方法创建SQL查询,并返回结果集。例如: ```java Session session = sessionFactory.openSession(); SQLQuery sqlQuery = session.createSQLQuery("SELECT * FROM USER WHERE ...
Hibernate Validation自定义注解校验的实现是指在Hibernate Validation框架中,使用自定义的注解来实现特定的校验逻辑。在本文中,我们将通过示例代码,详细地介绍如何实现自定义注解校验。 首先,我们需要了解...
**Struts、Hibernate和自定义标签在构建网上书店系统中的应用** 本网上书店系统是一个基于MVC(Model-View-Controller)设计模式的Web应用程序,它整合了Java的两大核心框架——Struts和Hibernate,以及自定义标签...
在Java编程语言中,...这涉及到对Java基本类型、复杂类型以及自定义对象的映射,还包括对数据库NULL值的处理、对象关系映射以及工具的使用策略。熟悉这些知识,可以帮助开发者更高效地利用Hibernate进行数据持久化。
在使用Hibernate进行数据库操作时,有时会遇到一个常见的问题,即当从数据库中查询Date类型的数据并由Hibernate返回时,发现结果中的时分秒部分不正确。这个问题通常源于多个因素,包括日期时间的序列化与反序列化...
4. **定义Hibernate Native SQL查询**:由于Hibernate默认不支持调用存储过程或函数,我们需要使用`@NamedNativeQuery`或`@SqlResultSetMapping`注解来定义一个原生SQL查询,用于调用Oracle函数。例如: ```java @...
使用自定义类型映射 Oracle 中的 LONG 类型字段是解决 Hibernate 框架中 LONG 类型字段读写问题的一种有效方法。通过实现 UserType 接口,我们可以定制 LONG 类型字段的读写操作,并提高 Hibernate 框架的灵活性和可...
本文档将详细介绍如何使用 Hibernate 对 Blob 类型字段进行数据添加的过程,并通过实际代码示例来展示具体的操作步骤。 #### Hibernate Blob 数据处理原理 在 Hibernate 中,Blob 类型的字段通常被映射为 `java....
关于Hibernate的各种主键生成策略与配置详解
标题和描述中提到的"邮箱(hibernate+Servlet+自定义标签,内带hibernate配置,自定义标签分页)"是一个基于Java技术栈的Web应用项目,它利用Hibernate作为持久层框架,Servlet作为控制层,以及自定义标签来实现前端展示...
hibernate和java类型转换,hibernate和java类型转换
Hibernate,作为Java中广泛使用的对象关系映射(ORM)框架,提供了一种优雅的方式来映射枚举类型到数据库。本文将深入探讨Hibernate如何映射枚举类型,并给出实际应用示例。 ### Hibernate枚举映射方式 #### 1. `@...
此外,Hibernate还支持自定义数据类型的映射,允许开发者根据需求扩展和定制。 在实际开发中,理解这些映射关系至关重要,因为它直接影响到数据的存储和查询效率,以及数据的一致性和完整性。例如,如果错误地将...
**自定义 Hibernate Tools 模板**是针对 Eclipse 开发环境中的 Hibernate 工具集进行的一种扩展,目的是在使用 Hibernate 逆向工程(Reverse Engineering)生成实体类时,能够根据数据库中的注释自动添加对应的注释...
1. **创建自定义标签**: 编写一个Java类作为自定义标签的实现,这个类需要继承自`javax.servlet.jsp.tagext.TagSupport`或`javax.servlet.jsp.tagext.SimpleTagSupport`,并覆盖其中的方法来处理分页逻辑。...
然而,当涉及到多模块整合或已有自定义数据库连接池时,可能需要扩展Hibernate以使用自定义的数据库连接池。本文将详细讲解如何实现这一过程。 首先,Hibernate通过`ConnectionProvider`接口来管理数据库连接。这个...