1. UserType
 
  
  1. public interface UserType { 
  2.     /** 
  3.      *  返回UserType所映射字段的SQL类型 
  4. * (java.sql.Types中每一种类型都有对应int值) 
  5.    *    返回类型为int[],其中包含了映射N个字段的SQL类型代码 
  6.    *    (UserType可以映射到一个或者多个字段) 
  7.      * @return int[] the typecodes 
  8.      */ 
  9.     public int[] sqlTypes(); 
  10.     /** 
  11.      * UserType.nullSafeGet()所返回的自定义数据的类型 
  12.      * 
  13.      * @return Class 
  14.      */ 
  15.     public Class returnedClass(); 
  16.     /** 
  17. * 自定义数据类型的比对方法 
  18. * 此方法将用作脏数据检查,参数x、y分别为数据的两个副本 
  19. * 如果equals方法返回false,则Hibernate将认为数据发生变化,并将变化更新到数据库表中 
  20.      * @param x 
  21.      * @param y 
  22.      * @return boolean 
  23.      */ 
  24.     public boolean equals(Object x, Object y) throws HibernateException; 
  25.     /** 
  26.      * 与上面的equals保持一致 
  27.      */ 
  28.     public int hashCode(Object x) throws HibernateException; 
  29.     /** 
  30.      * 本方法将在Hibernate进行数据返回时被调用 
  31.      * 从JDBC ResultSet读取数据,将其转换为自定义类型后返回 
  32. * 此方法要求对可能能出现null值进行处理(null safe) 
  33.      * @param rs a JDBC result set 
  34.      * @param names 对应的N个数据库字段名 
  35.      * @param owner the containing entity 
  36.      * @return Object 类型见returnedClass 
  37.      * @throws HibernateException 
  38.      * @throws SQLException 
  39.      */ 
  40.     public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException; 
  41.     /** 
  42.      * 本方法将在Hibernate进行数据保存时被调用 
  43.    * 我们可以通过PreparedStateme将自定义数据写入到对应的数据库表字段 
  44.      * @param st a JDBC prepared statement 
  45.      * @param value the object to write 
  46.      * @param index statement parameter index 
  47.      * @throws HibernateException 
  48.      * @throws SQLException 
  49.      */ 
  50.     public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException; 
  51.     /** 
  52.      * 提供自定义类型的完全复制方法,本方法将用构造返回对象<br/> 
  53. * 当nullSafeGet方法调用之后,我们获得了自定义数据对象,在向用户返回自定义数据之前,deepCopy方法将被调用,它将根据自定义数据对象构造一个完全拷贝,并将此拷贝返回给用户,此时我们就得到了自定义数据对象的两个版本,第一个是从数据库读出的原始版本,其二是我们通过deepCopy方法构造的复制版本,原始的版本将有Hibernate维护,复制版由用户使用。<br/> 
  54. * 原始版本用作稍后的脏数据检查依据;Hibernate将在脏数据检查过程中将两个版本的数据进行对比(通过调用equals方法),如果数据发生了变化(equals方法返回false),则执行对应的持久化操作。 
  55. * @param value the object to be cloned, which may be null 
  56.      * @return Object a copy 
  57.      */ 
  58.     public Object deepCopy(Object value) throws HibernateException; 
  59.     /** 
  60.      * 本类型实例是否可变? 
  61.      * 
  62.      * @return boolean 
  63.      */ 
  64.     public boolean isMutable(); 
  65.     /** 
  66.      * disassemble是H3在UserType中新增的 
  67. * 它是H2中CompositeUserType接口中的方法。 
  68. * 当对象被写入二级缓存之前调用,通过这个方法可以将对象转换为易于在二级缓存中保存的形式 
  69. * 如对于某些无法序列化的数据,将其转化为序列化形式,典型情况: 
  70.      * 如对于当前对象对其它实体对象的引用,我们可以考虑将这种引用关系以id值的形式保存” 
  71. * 如果该对象的实例是可变的,则在这个方法中至少要做一次deepCopy,参数value表示要被缓存的对象 
  72.      * @param value the object to be cached 
  73.      * @return 该对象在二级缓存中形式 
  74.      * @throws HibernateException 
  75.      */ 
  76.     public Serializable disassemble(Object value) throws HibernateException; 
  77.     /** 
  78.      * assemble是H3在UserType中新增的,它是H2中CompositeUserType接口中的方法。  
  79. * "用于将二级缓存中获取的缓存数据重新转换为我们指定的对象类型" 
  80. * 如果该对象的实例是可变的,则在这个方法中至少要做一次deepCopy。 
  81.      * @param cached 二级缓存中的数据 
  82.      * @param owner 被缓存对象的宿主 
  83.      * @return a reconstructed object from the cachable representation 
  84.      * @throws HibernateException 
  85.      */ 
  86.     public Object assemble(Serializable cached, Object owner) throws HibernateException; 
  87.  
  88.     /** 
  89.      * 对象合并期间使用 
  90.      * 用original值替换target的值 
  91.      * 对于不可变对象,或者空值,简单返回第一个参数就可以了。对于可变对象,就要返回第一个参数的副本。对于组合值的对象,可以递归替换组合值。 
  92.      * @param original the value from the detached entity being merged 
  93.      * @param target the value in the managed entity 
  94.      * @return the value to be merged 
  95.      */ 
  96.     public Object replace(Object original, Object target, Object owner) throws HibernateException; 

ParameterizedType

获取配置文件中的参数,通过mapping或者typedef标签

 
  
  1. public interface ParameterizedType { 
  2.     /** 
  3.      * 设置通过Hibernate的配置获取的参数 
  4.      */ 
  5.     public void setParameterValues(Properties parameters); 

EnhancedUserType( 就是实现其与 string 之间的装换)
 
  
  1. public interface EnhancedUserType extends UserType { 
  2.     /** 
  3.      * 返回这个对象的SQL语句的文字形式 
  4.      */ 
  5.     public String objectToSQLString(Object value); 
  6.      
  7.     /** 
  8.      * 将value对象转换成一个String,并且该string可以用于xml文档 
  9.      */ 
  10.     public String toXMLString(Object value); 
  11.     /** 
  12.      * 将一个String 转换成一个对象 
  13.      */ 
  14.     public Object fromXMLString(String xmlValue);