我们的目标是为数据逻辑层及业务逻辑层提供更加易于操作的对象,根据这里的情况,将email字段映射为一个List集合
类型是个不错的选择,如何将一个字段映射为List类型,Hibernate并没有提供原生支持,我们必须实现自己的UserType.
package com.wyq.hibernate;
public interface UserType {
/**
* 返回UserType所映射字段的SQL类型(java.sql.Types)
* 返回类型为int[],其中包含了映射各字段的SQL类型代码
* (UserType可以映射到一个或者多个字段)
* @see java.sql.Types
* @return int[] the typecodes
*/
public int[] sqlTypes();
/**
* UserType.nullSafeGet()所返回的自定义数据类型
* @return Class
*/
public Class returnedClass();
/**
* 自定义数据类型的对比方法
* 此方法将用作脏数据检查,参数x,y分别为数据的2个副本
* 如果equals方法返回false,则Hibernate将认为数据发生变化,并将变化更新到库表中
*/
public boolean equals(Object x,Object y)throws HiberanteException;
/**
* 从JDBC ResultSet读出数据,将其转换为自定义类型后返回
* (此方法要求对可能出现的null值进行处理)
* names中包含了当前自定义类型的映射字段名称。
*/
public Object nullSafeGet(ResultSet rs,String[] names,Object owner)throws HibernateException,SQLException;
/**
* 本方法将在Hibernate进行数据保存时被调用
* 我们可以通过PreparedStatement将自定义数据写入对应的库表字段
*/
public void nullSafeSet(PreparedStatement st,Object value,int index)throws HibernateException,SQLException;
/**
* 提供自定义类型的完全复制方法
* 本方法将用作构造返回对象
* 当nullSafeGet方法调用之后,我们获得了自定义数据对象,在向用户返回自定义数据之前,deepCopy方法将被调用,
* 它将根据自定义数据对象构造一个完全拷贝,并将此拷贝返回给用户使用。
* 此时,我们就得到了自定义数据对象的2个版本,第一个是从数据库读出的原始版本,其二是我们通过deepCopy构造的
* 复制版本,原始版本将由Hibernate负责维护,复制版本将由用户使用,原始版本用作稍后的脏数据检查一句;Hibernate
* 将在脏数据检查过程中将这2个版本的数据进行比对,如果数据发生了变化,则执行对应的持久化操作。
* 数据发生了变化,则执行对应的持久化操作。
*/
public Object deepCopy(Object value)throws HibernateException;
/**
* 本类型实例是否可变
*/
public boolean isMutable();
}
posted on 2009-10-16 15:59
王永庆 阅读(156)
评论(0) 编辑 收藏 所属分类:
HIBERNATE