`
lifaming15
  • 浏览: 64764 次
  • 来自: ...
文章分类
社区版块
存档分类

实现CompositeUserType接口

 
阅读更多

Hibernate还提供了一个CompositeUserType借口,它不仅能完成和UserType相同的功能,而且还提供了对Hibernate查询语言(HQL)的支持.下面通过例子来介绍CompositeUserType接口的方法.

假定在Customer类中包含了一个Name类型的name属性,代表客户的姓名.例1是Name类的源程序.

例1:

package mypack;

import java.io.Serializable;

/**
* @author lfm
*
*/
public class Name implements Serializable {

private String firstname;

private String lastName;

public Name(String firstname, String lastName) {
super();
// TODO 自动生成构造函数存根
this.firstname = firstname;
this.lastName = lastName;
}

public String getFirstname() {
return firstname;
}

public void setFirstname(String firstname) {
this.firstname = firstname;
}

public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

public boolean equals(Object o) {
if (this == o)
return true;
if (!(o instanceof Name))
return false;
final Name name = (Name) o;
return firstname.equals(name.firstname)
&& lastName.equals(name.lastName);
}

public int hashCode() {
int result;
result = (firstname == null ? 0 : firstname.hashCode());
result = 29 * result + (lastName == null ? 0 : lastName.hashCode());
return result;
}

public String toString() {
return lastName + " " + firstname;
}
}

从例1看出,Name类是可变类.因此,如果需要修改Customer对象的name 属性,只需调用Name类的setFirstname()和setLastname()方法:

customer.setName(new Name("Lsosan", "Zhang"));

//修改Customer对象的name属性

customer.getName().setFirstname("Lsosi");

customer.getName().setLastname("Li");

接下来创建NameCompositeUserType类,它负责把Customer类的Name类型的属性映射到CUSTOMERS表的FIRSTNAME和LASTNAME字段.例2是NameCompositeUserType类的源程序.

例2:

package mypack;

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

import net.sf.hibernate.CompositeUserType;
import net.sf.hibernate.Hibernate;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.engine.SessionImplementor;
import net.sf.hibernate.type.Type;

/**
* @author lfm
*
*/
public class NameCompositeUserType implements CompositeUserType {

/**
* 返回Name类的所有属性的名字
*/
public String[] getPropertyNames() {
// TODO 自动生成方法存根
return new String[] { "firstname", "lastname" };
}

/**
* 返回Name类的所有属性的Hibernate映射类型
*/
public Type[] getPropertyTypes() {
// TODO 自动生成方法存根
return new Type[] { Hibernate.STRING, Hibernate.STRING };
}

/**
* 获取Name队形的某个属性的值。参数component代表Name对象,参数property代表属性在Name对象中的位置
*/
public Object getPropertyValue(Object component, int property)
throws HibernateException {
// TODO 自动生成方法存根
Name name = (Name) component;
String result;
switch (property) {
case 0:
result = name.getFirstname();
break;
case 1:
result = name.getLastName();
default:
throw new IllegalArgumentException("unknow property: " + property);
}
return result;
}

/**
* 设置Name对象的某个属性的值。参数component代表Name对象,参数property代表属性在Name对象中的位置,参数value代表属性值
*/
public void setPropertyValue(Object component, int property, Object value)
throws HibernateException {
// TODO 自动生成方法存根
Name name = (Name) component;
String nameValue = (String) value;
switch (property) {
case 0:
name.setFirstname(nameValue);
break;
case 1:
name.setLastName(nameValue);
default:
throw new IllegalArgumentException("unknow property: " + property);
}
}

/**
* 设置NameCompositeUserType所映射的Java类:Name类
*/
public Class returnedClass() {
// TODO 自动生成方法存根
return Name.class;
}

public boolean equals(Object x, Object y) throws HibernateException {
// TODO 自动生成方法存根
if (x == y)
return true;
if (x == null || y == null)
return false;
return x.equals(y);
}

public Object nullSafeGet(ResultSet rs, String[] names,
SessionImplementor session, Object owner)
throws HibernateException, SQLException {
// TODO 自动生成方法存根
if (rs.wasNull())
return null;
String firstname = rs.getString(names[0]);
String lastname = rs.getString(names[1]);
return new Name(firstname, lastname);
}

public void nullSafeSet(PreparedStatement statement, Object value,
int index, SessionImplementor session) throws HibernateException,
SQLException {
// TODO 自动生成方法存根
if (value == null)
statement.setNull(index, Types.VARCHAR);
else {
Name name = (Name) value;
statement.setString(index, name.getFirstname());
statement.setString(index + 1, name.getLastName());
}
}

/*
* (非 Javadoc)
*
* @see net.sf.hibernate.CompositeUserType#deepCopy(java.lang.Object)
*/
public Object deepCopy(Object value) throws HibernateException {
// TODO 自动生成方法存根
if (value == null)
return null;
Name name = (Name) value;
return new Name(name.getFirstname(), name.getLastName());
}

/*
* (非 Javadoc)
*
* @see net.sf.hibernate.CompositeUserType#isMutable()
*/
public boolean isMutable() {
// TODO 自动生成方法存根
return true;
}

/**
* 创建一格序列化的Name对象,Hibernate将把它保存到缓存中
*/
public Serializable disassemble(Object value, SessionImplementor session)
throws HibernateException {
// TODO 自动生成方法存根
return (Serializable) deepCopy(value);
}

/**
* 根据缓存中的序列化的Name对象,重新构建一个Name对象,参数cached代表缓存中的序列化的Name对象
*/
public Object assemble(Serializable cached, SessionImplementor session,
Object owner) throws HibernateException {
// TODO 自动生成方法存根
return deepCopy(cached);
}
}

从例2看出,CompositeUserType包含了UserType接口的大部分方法,此外,它还包含了用来访问Name类的所有属性的方法,getPropertyNames(),getPropertyTypes(),getPropertyValue(),setPropertyValue()

在Customer.hbm.xml文件中,以下代码用于把Name类型的name属性映射到CUSTOMERS表的FIRSTNAME和LASTNAME字段:

<property name="name" type="mypack.NameCompositeUserType">

<column name="FIRSTNAME" length="15"/>

<column name="LASTNAME" length="15"/>

</property>

在应用程序中创建HQL语句时,可以通过"c.name.firstname"的形式访问Customer的name属性的firstname属性:

Customer customer = session.find("from Customer as c where c.name.firstname='Tom'");

分享到:
评论

相关推荐

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

     11.2.3 实现CompositeUserType接口  11.2.4 运行本节范例程序  11.3 操纵Blob和Clob类型数据  11.4 小结  11.5 思考题 第12章 映射继承关系  12.1 继承关系树的每个具体类对应一个表  12.1.1 创建映射文件 ...

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

     11.2.3 实现CompositeUserType接口  11.2.4 运行本节范例程序  11.3 操纵Blob和Clob类型数据  11.4 小结  11.5 思考题 第12章 映射继承关系  12.1 继承关系树的每个具体类对应一个表  12.1.1 创建映射文件 ...

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

     11.2.3 实现CompositeUserType接口  11.2.4 运行本节范例程序  11.3 操纵Blob和Clob类型数据  11.4 小结  11.5 思考题 第12章 映射继承关系  12.1 继承关系树的每个具体类对应一个表  12.1.1 创建映射文件 ...

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

     11.2.3 实现CompositeUserType接口  11.2.4 运行本节范例程序  11.3 操纵Blob和Clob类型数据  11.4 小结  11.5 思考题 第12章 映射继承关系  12.1 继承关系树的每个具体类对应一个表  12.1.1 创建映射文件 ...

    hibernate(api_介绍)

    此外,还可以通过实现UserType和CompositeUserType接口自定义数据映射。 5. **可扩展接口** - **Dialect**:这是Hibernate的方言抽象类,为不同的数据库系统(如Oracle、MSSQL、Sybase)提供了特定的方言实现,以...

    hibernate(api 介绍).docx

    也可以通过实现 org.hibernate.usertype.CompositeUserType 接口来自定义数据映射类型。 可扩展接口 1. org.hibernate.usertype.UserType:可以自定义数据映射类型。 2. org.hibernate.dialect.Dialect abstract_...

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

    2. 实现`CompositeUserType`接口:这个接口适用于处理复合类型,即一个对象由多个字段组成,每个字段都有自己的数据类型。`CompositeUserType`需要实现的方法包括`propertyNames()`、`propertyTypes()`、`...

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

    2. **实现Hibernate用户类型接口**:自定义类型需要实现`org.hibernate.usertype.UserType`接口。这个接口要求我们重写一些关键方法,如`nullSafeGet()`、`nullSafeSet()`、`equals()`、`hashCode()`等,以便...

    hibernate3.2API

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

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

     16.2.2 实现泛型CRUD接口   16.2.3 实现实体DAO   16.2.4 利用数据访问对象   16.3 命令模式简介   16.3.1 基础接口   16.3.2 执行命令对象   16.3.3 命令模式的变形   16.4 利用EJB 3.0设计应用...

    hbm xml配置详解 ssh框架

    如果内置的映射类型无法满足需求,开发者可以通过实现 `net.sf.hibernate.UserType` 或 `net.sf.hibernate.CompositeUserType` 接口来自定义映射类型。自定义映射类型允许开发者将任何Java类映射到数据库的特定类型...

    hibernate4.1中文api

    - **基本API**: Session、SessionFactory、Transaction等核心接口的使用。 - **JMX集成**: 如何将Hibernate与JMX集成,以便监控和管理。 - **上下文会话**: 管理会话的生命周期,以及与线程的绑定。 #### 3. 配置 ...

    Hibernate Reference 4.3.4 zh_CN 中文版

    - **基本API**:列举了Hibernate API中最常用的类和接口。 **2.2 上下文的会话**:解释了Session和Session的生命周期,以及它们如何在事务中发挥作用。 #### 3. 配置 - **编程配置**:展示了如何通过编程的方式...

Global site tag (gtag.js) - Google Analytics