`
zzg
  • 浏览: 124855 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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.  }  

 
分享到:
评论

相关推荐

    商业编程-源码-VC开发工具使用技巧源代码 usertype.zip

    本资源“商业编程-源码-VC开发工具使用技巧源代码 usertype.zip”包含了一组与VC开发相关的源代码,旨在帮助开发者深入理解和掌握VC开发工具的实用技巧。 1. **VC开发环境设置**:VC不仅仅是一个编译器,它还包括一...

    Java Web综合实例.pdf

    - JavaBean负责数据操作和业务逻辑,虽然未使用接口,但接口的引入有助于提高代码的可维护性和可扩展性。 综上所述,这个Java Web综合实例展示了如何运用相关技术构建一个实际的图书管理系统,涵盖了Web开发的核心...

    动态添加hibernate domain的属性的例子

    `customfieldsdemo`这个文件很可能是示例代码的压缩包,包含了一个演示如何实现上述步骤的实例。解压后,你可以查看源码,学习如何在具体项目中应用动态属性。 总结一下,本例子展示了如何在Hibernate中动态添加...

    axios使用拦截器统一处理所有的http请求的方法.docx

    Axios 使用拦截器统一处理所有的 HTTP 请求的方法 ...本文将详细介绍 Axios 使用拦截器统一处理所有的 HTTP ...本文提供了详细的介绍和实例代码,希望对大家有所帮助。如果大家有任何疑问,请随时留言,我将尽快回复。

    枚举类型在switch语句中的用法

    例如,在提供的代码示例中,定义了一个名为`UserType`的枚举类型,该枚举包含了五个不同的用户类型:学生(`STUDENT`)、教师(`TEACHER`)、家长(`PARENT`)、学校管理员(`SCHOOL_ADMIN`)和未知类型(`UNKNOWN`...

    Listwidget控件实例1

    在本实例“Listwidget控件实例1”中,我们将深入探讨`QListWidget`的使用方法,以及如何在实际应用中有效地利用它。 `QListWidget`是Qt库中的一个类,它继承自`QWidget`,并且实现了`QAbstractItemView`的接口。这...

    J2EE企业级项目开发-1期 04 Hibernate使用经验.doc

    3. **自定义UserType实例**:例如,如果我们需要在`TUSER`表中存储用户的电子邮件,但不想为每个邮箱创建单独的记录,可以使用`UserType`将多个邮箱地址存储在一个`VARCHAR`字段内,以分号分隔。自定义的`Email`类...

    Sql编程规范

    合理的命名、避免使用模糊的特殊值、合理使用变量与常量、正确编写SQL语句以及有效地利用宏和自定义函数都是提升SQL编程质量的关键要素。希望这些规范能帮助您在日常工作中编写出更加高效且易于维护的SQL代码。

    TP(thinkPHP)框架多层控制器和多级控制器的使用示例

    本文将详细介绍thinkPHP框架中多层控制器和多级控制器的使用,结合实例分析其结构、原理及使用方法。 首先需要了解的是,在ThinkPHP中,控制器是负责接收用户的请求并调用模型和视图完成用户请求处理的任务。而多层...

    PyQt(Python+Qt)学习随笔:枚举类QTreeWidgetItem.ItemType、QListWidgetItem.ItemType的取值及含义

    在开发过程中,可以结合PyQt的文档和示例代码加深理解,同时也可以参考像老猿Python这样的博客资源,获取更多实践经验和技巧。 总结一下,QTreeWidgetItem.ItemType和QListWidgetItem.ItemType是PyQt中用于区分项...

    深入浅出MFC源代码

    FAQ可能包含了开发者在使用MFC时遇到的常见问题及其解决方案,而MFCFAQ40.ZIP可能是一个压缩包,里面包含了更详细的文档、示例代码或者其他有助于理解MFC的资料。这些资源对于初学者来说极其宝贵,因为它们提供了...

    hibernate(api 介绍).docx

    2. org.hibernate.SessionFactory Interface:从该接口中获得 Session 实例,具备多线程安全和重量级特点,一个数据库对应一个 SessionFactory,其创建及销毁消耗资源多。 3. org.hibernate.Session Interface:和...

    django使用graphql的实例

    在这个示例中,我们定义了两个DjangoObjectType类,分别对应 `User` 和 `Blog` 模型。同时,我们还定义了输入类型 `UserInput` 和 `BlogInput`,以及两个Mutation类 `CreateUser` 和 `CreateBlog`,用于创建新的用户...

    《深入解析MFC》源代码

    5. **动态链接库(DLL)**:MFC支持创建和使用DLL,源代码可能包含示例,展示了如何创建MFC DLL并与其他MFC应用程序交互。 6. **ActiveX和COM**:MFC提供了对COM(Component Object Model)的支持,源代码可能包含...

    游标、存储过程和触发器.pptx

    在实际应用中,通常会结合使用这些语句,如示例所示,从游标中读取数据并输出。 其次,存储过程(Stored Procedure)是一组预先编译的SQL语句,可以在需要时重复调用,以提高性能和简化代码。存储过程可以包含输入...

    使用JDBC访问数据库

    ### 使用JDBC访问数据库 #### 一、JDBC概述及MySQL连接 JDBC(Java Database ...以上是使用JDBC访问数据库的一个完整示例,包括数据库和表的创建、基本的CRUD操作以及更高级的MVC分层设计和用户认证功能。

    oracle笔试

    Oracle数据库是企业级广泛使用的数据库管理系统,本文将围绕Oracle笔试中的核心知识点进行详尽的阐述,帮助备考者全面理解和掌握Oracle的相关概念和技术。 首先,Oracle数据库的逻辑结构包括方案、对象、数据块、...

    php权限控制的类是很全面的

    下面将详细介绍这个类的结构、功能和使用方法。 首先,从代码中可以看出,这个类采用单例模式设计,确保在整个应用中只有一个`include_purview`类的实例存在。通过定义`getInstance()`方法,我们可以获取到这个唯一...

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

     9.4.2 使用脱管的实体实例   9.5 在EJB组件中使用Java Persistence   9.5.1 注入EntityManager   9.5.2 查找EntityManager   9.5.3 访问EntityManagerFactory   9.6 小结   第10章 事务和并发   ...

Global site tag (gtag.js) - Google Analytics