一、UserType
Hibernate拥有自己定义映射表属性的机制。主要通过实现接口UserType,详细的UserType:
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import net.sf.hibernate.HibernateException;
/**
* @author hy-he
*
*/
public interface UserType {
/**
* 返回UserType所映射字段的SQL类型(java.sql.Types)
* 返回类型为int[],当中包括了映射个字段的SQL类型代码
* (UserType能够映射到一个或者多个字段)
* @return
*/
public int[]sqlTypes();
/**
* UserType.nullSafeGet()所返回的自己定义数据类型
* @return
*/
public Class returnedClass();
/**
* 自己定义数据类型的比对方法
* 此方法将用作脏数据检查。參数x、y分别为数据的两个副本
* 假设equals方法返回false,则Hibernate将觉得数据发生变化,并将变化更新到数据库表中
* @param x
* @param y
* @return
* @throws HibernateException
*/
public boolean equals(Object x,Object y)throws HibernateException;
/**
* 从JDBC ResultSet读取数据,将其转换为自己定义类型后返回
* (此方法要求对克能出现null值进行处理)
* names中包括了当前自己定义类型的映射字段名称
* @param rs
* @param names
* @param owner
* @return
* @throws HibernateException
* @throws SQLException
*/
public Object nullSafeGet(ResultSet rs,String[] names,Object owner)throws HibernateException,SQLException;
/**
* 本方法将在Hibernate进行数据保存时被调用
* 我们能够通过PreparedStateme将自己定义数据写入到相应的数据库表字段
* @param st
* @param value
* @param index
* @throws HibernateException
* @throws SQLException
*/
public void nullSafeSet(PreparedStatement st,Object value,int index)throws HibernateException,SQLException;
/**
* 提供自己定义类型的全然复制方法
* 本方法将用构造返回对象
* 当nullSafeGet方法调用之后,我们获得了自己定义数据对象。在向用户返回自己定义数据之前,
* deepCopy方法将被调用。它将根据自己定义数据对象构造一个全然拷贝。并将此拷贝返回给用户
* 此时我们就得到了自己定义数据对象的两个版本号,第一个是从数据库读出的原始版本号。其二是我们通过
* deepCopy方法构造的复制版本号,原始的版本号将有Hibernate维护,复制版由用户使用。原始版本号用作
* 稍后的脏数据检查根据;Hibernate将在脏数据检查过程中将两个版本号的数据进行对照(通过调用
* equals方法)。假设数据发生了变化(equals方法返回false),则运行相应的持久化操作
*
* @param value
* @return
* @throws HibernateException
*/
public Object deppCopy(Object value)throws HibernateException;
/**
* 本类型实例是否可变
* @return
*/
public boolean isMutable();
}
样例:一个学生有联系地址。而联系地址又分为家庭地址和工作地址,我们能够把两个地址信息抽象成一个新的Address类。作为Student的成员变量。
数据库结构:
Hibernate.cfg.xml
Pojo
自己定义类型
*/
* 因为AddressType是不可变的,所以深拷贝能够直接返回对象引用。
拷贝的对象由应用程序使用。 而原版对象由Hibernate维护以做脏数据检查 */
读取数据并组装成一个AddressType对象。
names[]中的參数顺序按照映射文件里定义的顺序 */ public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
返回 homeAddr。
*/
Student.hbm.xml
測试代码:
CompositeUserType拥有UserType全部的接口,并提供了更加丰富的功能。能够实现更加复杂的功能。
待续...