usertype的详细解释和使用实例

 usertype的详细解释和使用实例

java 代码
 
  1. import java.sql.PreparedStatement;  
  2. import java.sql.ResultSet;  
  3. import java.sql.SQLException;  
  4.   
  5. import net.sf.hibernate.HibernateException;  
  6.   
  7. /** 
  8.  * @author hy-he 
  9.  * 
  10.  */  
  11. public interface UserType {  
  12.   
  13.  /** 
  14.   * 返回UserType所映射字段的SQL类型(java.sql.Types) 
  15.   * 返回类型为int[],其中包含了映射个字段的SQL类型代码 
  16.   * (UserType可以映射到一个或者多个字段) 
  17.   * @return 
  18.   */  
  19.  public int[]sqlTypes();  
  20.   
  21.   
  22.  /** 
  23.   * UserType.nullSafeGet()所返回的自定义数据类型 
  24.   * @return 
  25.   */  
  26.  public Class returnedClass();  
  27.   
  28.   
  29.  /** 
  30.   * 自定义数据类型的比对方法 
  31.   * 此方法将用作脏数据检查,参数x、y分别为数据的两个副本 
  32.   * 如果equals方法返回false,则Hibernate将认为数据发生变化,并将变化更新到数据库表中 
  33.   * @param x 
  34.   * @param y 
  35.   * @return 
  36.   * @throws HibernateException 
  37.   */  
  38.  public boolean equals(Object x,Object y)throws HibernateException;  
  39.   
  40.   
  41.  /** 
  42.   * 从JDBC ResultSet读取数据,将其转换为自定义类型后返回 
  43.   * (此方法要求对克能出现null值进行处理) 
  44.   * names中包含了当前自定义类型的映射字段名称 
  45.   * @param rs 
  46.   * @param names 
  47.   * @param owner 
  48.   * @return 
  49.   * @throws HibernateException 
  50.   * @throws SQLException 
  51.   */  
  52.  public Object nullSafeGet(ResultSet rs,String[] names,Object owner)throws HibernateException,SQLException;  
  53.   
  54.   
  55.  /** 
  56.   * 本方法将在Hibernate进行数据保存时被调用 
  57.   * 我们可以通过PreparedStateme将自定义数据写入到对应的数据库表字段 
  58.   * @param st 
  59.   * @param value 
  60.   * @param index 
  61.   * @throws HibernateException 
  62.   * @throws SQLException 
  63.   */  
  64.  public void nullSafeSet(PreparedStatement st,Object value,int index)throws HibernateException,SQLException;  
  65.   
  66.   
  67.  /** 
  68.   * 提供自定义类型的完全复制方法 
  69.   * 本方法将用构造返回对象 
  70.   * 当nullSafeGet方法调用之后,我们获得了自定义数据对象,在向用户返回自定义数据之前, 
  71.   * deepCopy方法将被调用,它将根据自定义数据对象构造一个完全拷贝,并将此拷贝返回给用户 
  72.   * 此时我们就得到了自定义数据对象的两个版本,第一个是从数据库读出的原始版本,其二是我们通过 
  73.   * deepCopy方法构造的复制版本,原始的版本将有Hibernate维护,复制版由用户使用。原始版本用作 
  74.   * 稍后的脏数据检查依据;Hibernate将在脏数据检查过程中将两个版本的数据进行对比(通过调用 
  75.   * equals方法),如果数据发生了变化(equals方法返回false),则执行对应的持久化操作 
  76.   * 
  77.   * @param value 
  78.   * @return 
  79.   * @throws HibernateException 
  80.   */  
  81.  public Object deppCopy(Object value)throws HibernateException;  
  82.   
  83.   
  84.  /** 
  85.   * 本类型实例是否可变 
  86.   * @return 
  87.   */  
  88.  public boolean isMutable();  
  89. }  




1.实现UserType接口的EMailList自定义类型

java 代码
 
  1. import java.sql.PreparedStatement;  
  2. import java.sql.ResultSet;  
  3. import java.sql.SQLException;  
  4. import java.sql.Types;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7.   
  8. import org.apache.commons.lang.StringUtils;  
  9.   
  10. import net.sf.hibernate.Hibernate;  
  11. import net.sf.hibernate.HibernateException;  
  12. import net.sf.hibernate.UserType;  
  13. import net.sf.hibernate.hql.Parser;  
  14.   
  15. /** 
  16.  * @author hy-he 
  17.  * 
  18.  */  
  19. public class EMailList implements UserType {  
  20.  private List emails;  
  21.  private static final String SPLITTER = ";";  
  22.  private static final int[] TYPES = new int[]{  
  23.   Types.VARCHAR  
  24.  };  
  25.  /* (non-Javadoc) 
  26.   * @see net.sf.hibernate.UserType#sqlTypes() 
  27.   */  
  28.  public int[] sqlTypes() {  
  29.   // TODO Auto-generated method stub  
  30.   return TYPES;  
  31.  }  
  32.   
  33.  /* (non-Javadoc) 
  34.   * @see net.sf.hibernate.UserType#returnedClass() 
  35.   */  
  36.  public Class returnedClass() {  
  37.   // TODO Auto-generated method stub  
  38.   return List.class;  
  39.  }  
  40.   
  41.  /* (non-Javadoc) 
  42.   * @see net.sf.hibernate.UserType#equals(java.lang.Object, java.lang.Object) 
  43.   */  
  44.  public boolean equals(Object x, Object y) throws HibernateException {  
  45.   if(x == y) return true;  
  46.   if(x != null && y != null){  
  47.    List xList = (List)x;  
  48.    List yList = (List)y;  
  49.    if(xList.size() != yList.size()) return false;  
  50.    for(int i = 0;i<xList.size();i++){  
  51.     String str1 = (String)xList.get(i);  
  52.     String str2 = (String)yList.get(i);  
  53.     if(!str1.equals(str2)) return false;  
  54.    }  
  55.    return true;  
  56.   }  
  57.   return false;  
  58.  }  
  59.   
  60.  /* (non-Javadoc) 
  61.   * @see net.sf.hibernate.UserType#nullSafeGet(java.sql.ResultSet, java.lang.String[], java.lang.Object) 
  62.   */  
  63.  public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {  
  64.   String value = (String)Hibernate.STRING.nullSafeGet(rs,names[0]);  
  65.   if( value != null){  
  66.    return parse(value);  
  67.   }else{  
  68.    return null;  
  69.   }  
  70.  }  
  71.   
  72.  /* (non-Javadoc) 
  73.   * @see net.sf.hibernate.UserType#nullSafeSet(java.sql.PreparedStatement, java.lang.Object, int) 
  74.   */  
  75.  public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {  
  76.   System.out.println("Set method excecuted");  
  77.   if(value != null){  
  78.    String str = assemble((List)value);  
  79.    Hibernate.STRING.nullSafeSet(st,str,index);  
  80.   }else{  
  81.    Hibernate.STRING.nullSafeSet(st,value,index);  
  82.   }  
  83.   
  84.  }  
  85.   
  86.  /* (non-Javadoc) 
  87.   * @see net.sf.hibernate.UserType#deepCopy(java.lang.Object) 
  88.   */  
  89.  public Object deepCopy(Object value) throws HibernateException {  
  90.   List sourcelist = (List)value;  
  91.   List targetlist = new ArrayList();  
  92.   targetlist.addAll(sourcelist);  
  93.   return targetlist;  
  94.  }  
  95.   
  96.  /* (non-Javadoc) 
  97.   * @see net.sf.hibernate.UserType#isMutable() 
  98.   */  
  99.  public boolean isMutable() {  
  100.   // TODO Auto-generated method stub  
  101.   return false;  
  102.  }  
  103.  private String assemble(List emailList){  
  104.   StringBuffer strBuf = new StringBuffer();  
  105.   for(int i = 0;i<emailList.size()-1;i++){  
  106.    strBuf.append(emailList.get(i)).append(SPLITTER);  
  107.   }  
  108.   strBuf.append(emailList.get(emailList.size()-1));  
  109.   return strBuf.toString();  
  110.  }  
  111.  private List parse(String value){  
  112.   String[] strs = StringUtils.split(value,SPLITTER);  
  113.   List emailList = new ArrayList();  
  114.   for(int i = 0;i<strs.length;i++){  
  115.    emailList.add(strs[i]);  
  116.   }  
  117.   return emailList;  
  118.  }  
  119. }  


2.POJO:

java 代码
 
  1. import java.io.Serializable;  
  2. import java.util.List;  
  3.   
  4. /** 
  5.  * @author hy-he 
  6.  * @hibernate.class 
  7.  * table = "USER_TYPE_USER" 
  8.  */  
  9. public class UserTypeUser implements Serializable {  
  10.  private Long id;  
  11.  private String name;  
  12.  private Integer age;  
  13.  private List email = new ArrayList();  
  14.  /** 
  15.   * @hibernate.id 
  16.   * column = "USER_ID" 
  17.   * generator-class = "increment" 
  18.   * @return 
  19.   */  
  20.  public Long getId() {  
  21.   return id;  
  22.  }  
  23.  /** 
  24.   * @hibernate.property 
  25.   * column = "AGE" 
  26.   * @return 
  27.   */  
  28.  public Integer getAge() {  
  29.   return age;  
  30.  }  
  31.  /** 
  32.   * @hibernate.property 
  33.   * column = "EMAIL" 
  34.   * type = "hibernate.usertype.EMailList" 
  35.   * @return 
  36.   */  
  37.  public List getEmail() {  
  38.   return email;  
  39.  }  
  40.  /** 
  41.   * @hibernate.property 
  42.   * column = "NAME" 
  43.   * @return 
  44.   */  
  45.  public String getName() {  
  46.   return name;  
  47.  }  
  48.  public void setAge(Integer age) {  
  49.   this.age = age;  
  50.  }  
  51.  public void setEmail(List email) {  
  52.   this.email = email;  
  53.  }  
  54.  public void setId(Long id) {  
  55.   this.id = id;  
  56.  }  
  57.  public void setName(String name) {  
  58.   this.name = name;  
  59.  }  
  60.    
  61. }  

3.xml:

xml 代码
 
  1. <?xml version="1.0"?>  
  2.   
  3. <!DOCTYPE hibernate-mapping PUBLIC  
  4.     "-//Hibernate/Hibernate Mapping DTD 2.0//EN"  
  5.     "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">  
  6.   
  7. <hibernate-mapping>  
  8.     <class  
  9.         name="hibernate.usertype.UserTypeUser"  
  10.         table="USER_TYPE_USER"  
  11.         dynamic-update="false"  
  12.         dynamic-insert="false"  
  13.     >  
  14.   
  15.         <id  
  16.             name="id"  
  17.             column="USER_ID"  
  18.             type="java.lang.Long"  
  19.         >  
  20.             <generator class="increment">  
  21.             </generator>  
  22.         </id>  
  23.   
  24.         <property  
  25.             name="age"  
  26.             type="java.lang.Integer"  
  27.             update="true"  
  28.             insert="true"  
  29.             access="property"  
  30.             column="AGE"  
  31.         />  
  32.   
  33.         <property  
  34.             name="email"  
  35.             type="hibernate.usertype.EMailList"  
  36.             update="true"  
  37.             insert="true"  
  38.             access="property"  
  39.             column="EMAIL"  
  40.         />  
  41.   
  42.         <property  
  43.             name="name"  
  44.             type="java.lang.String"  
  45.             update="true"  
  46.             insert="true"  
  47.             access="property"  
  48.             column="NAME"  
  49.         />  
  50.   
  51.         <!--  
  52.             To add non XDoclet property mappings, create a file named  
  53.                 hibernate-properties-UserTypeUser.xml  
  54.             containing the additional properties and place it in your merge dir.  
  55.         -->  
  56.   
  57.     </class>  
  58.   
  59. </hibernate-mapping>  

4.运用:

java 代码
 
  1. insert方法:  
  2.   
  3. public static void insertUser() throws HibernateException {  
  4.   UserTypeUser user = new UserTypeUser();  
  5.   user.setAge(new Integer(23));  
  6.   user.setName("Test UserType");  
  7.   user.getEmail().add("rever@hotmail.com");  
  8.   user.getEmail().add("rever1@hotmail.com");  
  9.   user.getEmail().add("rever2@hotmail.com");  
  10.   user.getEmail().add("rever3@hotmail.com");  
  11.   Session session = HibernateUtil.currentSession();  
  12.   Transaction tx = session.beginTransaction();  
  13.   session.save(user);  
  14.   
  15.   tx.commit();  
  16.   HibernateUtil.closeSession();  
  17.  }  
  18.   
  19. display方法:  
  20.   
  21.  public static void display() throws HibernateException {  
  22.   Session session = HibernateUtil.currentSession();  
  23.   List users = session.find("from UserTypeUser");  
  24.   HibernateUtil.closeSession();  
  25.   
  26.   for (ListIterator iterator = users.listIterator(); iterator.hasNext();) {  
  27.    UserTypeUser pu = (UserTypeUser) iterator.next();  
  28.    System.out.println(pu.getName());  
  29.    List emails = pu.getEmail();  
  30.    for(int i = 0;i<emails.size();i++){  
  31.     System.out.println(emails.get(i));  
  32.    }  
  33.   }  
  34.  }  

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值