`

hibernate3.2上使用UserType范例

 
阅读更多
http://heweiya.iteye.com/blog/106096

仔细看看hibernate的DOC发现不少惊奇的东东,后悔自己的旁门助道是多么的无用.
     本次主要实现目的.
     数据库表:EchoMessageEmail,其中有三个字段id(自动编号)\name\Email(varchar)
     实现目的:数据库字段中Email的值是类似于heweiya@gmail.com;heweiya@21cn.com;www.1718zx.cn的.所以要求以List表达.
也就是生成的DataModel当中是有一个List对象的.
     .hbm.xml

xml 代码

<?xml version="1.0" encoding="utf-8"?>  
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<!--  
    Mapping file autogenerated by MyEclipse - Hibernate Tools 
-->  
<hibernate-mapping>  
    <class name="com.travelsky.hibernate.po.EchoMessageEmail" table="echo_message_email">  
        <id name="id" type="java.lang.Integer">  
            <column name="ID" />  
            <generator class="native"></generator>  
        </id>  
        <property name="name" type="java.lang.String">  
            <column name="NAME" length="50" not-null="true" />  
        </property>  
        <property name="email" type="com.travelsky.hibernate.po.EmailList" lazy="true">  
            <column name="EMAIL"/>             
        </property>          
    </class>  
</hibernate-mapping>  
对应的POJO:

java 代码

package com.travelsky.hibernate.po;  
import java.util.List;  
  
/** 
* EchoMessageEmail generated by MyEclipse Persistence Tools 
*/  
  
public class EchoMessageEmail  implements java.io.Serializable {  
  
     private Integer id;  
     private String name;  
     private List email;  
  
    /** default constructor */  
    public EchoMessageEmail() {  
    }  
  
    /** minimal constructor */  
    public EchoMessageEmail(String name) {  
        this.name = name;  
    }  
      
    /** full constructor */  
    public EchoMessageEmail(String name, List email) {  
        this.name = name;  
        this.email = email;  
    }  
  
     
    // Property accessors  
  
    public Integer getId() {  
        return this.id;  
    }  
      
    public void setId(Integer id) {  
        this.id = id;  
    }  
  
    public String getName() {  
        return this.name;  
    }  
      
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public List getEmail() {  
        return email;  
    }  
  
    public void setEmail(List email) {  
        this.email = email;  
    }  
  
}  
其中的UserType的一个类:EmailList

java 代码

package com.travelsky.hibernate.po;  
  
import java.io.Serializable;  
import java.sql.PreparedStatement;  
import java.sql.ResultSet;  
import java.sql.SQLException;  
import java.sql.Types;  
import java.util.ArrayList;  
import java.util.List;  
  
import org.apache.commons.lang.StringUtils;  
import org.hibernate.HibernateException;  
import org.hibernate.Hibernate;  
  
/** 
* 必须得引用java.io.Serializable,UserType是反序列化 
* 另外,我使用的hibernate版本是3.2,UserType从2.0到3.2有很大的差异,应该多多看看官方的doc 
*  
* @author @家军.严重注意org.hibernate.usertype.UserType,不要自己造车呀.
*  
*/  
public class EmailList implements java.io.Serializable,org.hibernate.usertype.UserType{  
  
    private List emails;  
  
    private static final String SPLITTER = ";";  
  
    private static final int[] TYPES = new int[] { Types.VARCHAR };  
  
    public int[] sqlTypes() {  
          
        return TYPES;  
    }  
  
    public Class returnedClass() {  
        // TODO Auto-generated method stub  
        return List.class;  
    }  
  
    public boolean equals(Object x, Object y) throws HibernateException {  
        if (x == y)  
            return true;  
        if (x != null && y != null) {  
            List xList = (List) x;  
            List yList = (List) y;  
            if (xList.size() != yList.size())  
                return false;  
            for (int i = 0; i < xList.size(); i++) {  
                String str1 = (String) xList.get(i);  
                String str2 = (String) yList.get(i);  
                if (!str1.equals(str2))  
                    return false;  
            }  
            return true;  
        }  
        return false;  
    }  
  
    public Object nullSafeGet(ResultSet rs, String[] names, Object owner)  
            throws HibernateException, SQLException {  
        String value = (String) Hibernate.STRING.nullSafeGet(rs, names[0]);  
        if (value != null) {  
            return parse(value);  
        } else {  
            return null;  
        }  
    }  
  
    public void nullSafeSet(PreparedStatement st, Object value, int index)  
            throws HibernateException, SQLException {  
        System.out.println("Set method excecuted");  
        if (value != null) {  
            String str = assemble((List) value);  
            Hibernate.STRING.nullSafeSet(st, str, index);  
        } else {  
            Hibernate.STRING.nullSafeSet(st, value, index);  
        }  
  
    }  
  
    public Object deepCopy(Object value) throws HibernateException {  
        List sourcelist = (List) value;  
        List targetlist = new ArrayList();  
        targetlist.addAll(sourcelist);  
        return targetlist;  
    }  
  
    public boolean isMutable() {          
        return false;  
    }  
  
    private String assemble(List emailList) {  
        StringBuffer strBuf = new StringBuffer();  
        for (int i = 0; i < emailList.size() - 1; i++) {  
            strBuf.append(emailList.get(i)).append(SPLITTER);  
        }  
        strBuf.append(emailList.get(emailList.size() - 1));  
        return strBuf.toString();  
    }  
  
    private List parse(String value) {  
        String[] strs = StringUtils.split(value, SPLITTER);  
        List emailList = new ArrayList();  
        for (int i = 0; i < strs.length; i++) {  
            emailList.add(strs[i]);  
        }  
        return emailList;  
    }  
  
    public Object assemble(Serializable arg0, Object arg1) throws HibernateException {  
        // TODO Auto-generated method stub  
        return null;  
    }  
  
    public Serializable disassemble(Object arg0) throws HibernateException {  
        // TODO Auto-generated method stub  
        return null;  
    }  
  
    public int hashCode(Object arg0) throws HibernateException {  
        // TODO Auto-generated method stub  
        return 0;  
    }  
  
    public Object replace(Object arg0, Object arg1, Object arg2) throws HibernateException {  
        // TODO Auto-generated method stub  
        return null;  
    }  
  
}  
测试类:

java 代码

package com.travelsky.test;  
import java.util.List;  
import java.util.ListIterator;  
import com.travelsky.hibernate.po.EchoMessageEmail;  
import org.hibernate.Query;  
import org.hibernate.Session;  
import org.hibernate.SessionFactory;  
import org.hibernate.cfg.Configuration;  
  
public class HibernateTest {  
  
    public static void main(String[] args) throws Exception{          
        Configuration config = new Configuration().configure();  
        SessionFactory factory = config.buildSessionFactory();  
        Session session = factory.openSession();  
        Query query = session.createQuery("from EchoMessageEmail as a");  
        /** 
         * 理论上来说,这里不存在lazy加载,为了安全起见使用了Iterator 
         *  
         */  
        ListIterator iterator = query.list().listIterator();  
        EchoMessageEmail tt = (EchoMessageEmail) iterator.next();//只找第一个  
        List emails = tt.getEmail();              
        for (int i = 0; i < emails.size(); i++) {  
            String emailStr = (String)emails.get(i);  
            System.out.println(emailStr);  
        }         
        session.close();  
    }     
分享到:
评论

相关推荐

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    第8章 通过Hibernate操纵对象(上)  8.1 Java对象在JVM中的生命周期  8.2 理解Session的缓存  8.2.1 Session的缓存的作用  8.2.2 脏检查及清理缓存的机制  8.3 Java对象在Hibernate持久化层的状态  8.3.1 ...

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

     2.2.2 使用Hibernate EntityManager   2.2.3 引入EJB组件   2.2.4 切换到Hibernate接口   2.3 反向工程遗留数据库   2.3.1 创建数据库配置   2.3.2 定制反向工程   2.3.3 生成Java源代码   2.4 与...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

    第8章 通过Hibernate操纵对象(上)  8.1 Java对象在JVM中的生命周期  8.2 理解Session的缓存  8.2.1 Session的缓存的作用  8.2.2 脏检查及清理缓存的机制  8.3 Java对象在Hibernate持久化层的状态  8.3.1 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

    第8章 通过Hibernate操纵对象(上)  8.1 Java对象在JVM中的生命周期  8.2 理解Session的缓存  8.2.1 Session的缓存的作用  8.2.2 脏检查及清理缓存的机制  8.3 Java对象在Hibernate持久化层的状态  8.3.1 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

    第8章 通过Hibernate操纵对象(上)  8.1 Java对象在JVM中的生命周期  8.2 理解Session的缓存  8.2.1 Session的缓存的作用  8.2.2 脏检查及清理缓存的机制  8.3 Java对象在Hibernate持久化层的状态  8.3.1 ...

    VC开发工具使用技巧源代码_usertype.zip

    VC开发工具使用技巧源代码_usertype.zipVC开发工具使用技巧源代码_usertype.zipVC开发工具使用技巧源代码_usertype.zipVC开发工具使用技巧源代码_usertype.zipVC开发工具使用技巧源代码_usertype.zip

    CUDA SDK 语法高亮必备 usertype.dat

    在VS中配置CUDA时,本身是不识别CUDA关键字的,关键字不能高亮。早期的CUDA版本在SDK中提供了usertype.dat,其中包含CUDA的关键字,但后来的CUDA没有这个文件,网上找了好久,现在贴出来亲测可用~

    ssh(structs,spring,hibernate)框架中的上传下载

     fileContent字段映射为Spring所提供的BlobByteArrayType类型,BlobByteArrayType是用户自定义的数据类型,它实现了Hibernate 的org.hibernate.usertype.UserType接口。BlobByteArrayType使用从sessionFactory获取...

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

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

    usertype.dat

    HLSL的关键字,放在vs的IDE文件下,以在vs中高亮HLSL的关键字

    VS2005编辑器支持着色器语法高亮,一个完整的usertype.dat

    1. 创建或编辑usertype.dat文件(此文件在VS安装目录下的Common7\IDE下面,比如我的就在D:\Program Files\Microsoft Visual Studio 8\Common7\IDE\usertype.dat),添加如下的关键字列表,每个单词占一行,如果你想...

    hibernate3.6 文档(pdf 格式)

    3.2. Obtaining a SessionFactory ............................................................................... 32 3.3. JDBC connections ..................................................................

    hibernate_test

    需要使用这个:添加到 build.gradle compile 'org.jadira.usertype:usertype.jodatime:2.0.1' add to *.hbm.xml 数据库详细信息:CREATE DATABASE datamanagerdb WITH OWNER = datamanageruser ENCODING = 'UTF8' ...

    synon2hbm-开源

    从Synon:2E中定义的数据模型生成Hibernate映射和Hibernate UserType(aka COOL:2E aka Advantage:2E aka AllFusion:2E)。

    网页短视频管理系统,框架 vs2019 + asp.net webform + sql server

    注意sql server类和access数据库可以使用vs自带的数据库启动,不需要安装庞大的sql安装包。 测试用户 qqq 123456 后台管理用户 admin 123456 模块介绍 管理员 上传电影模块 电影信息管理模块 用户信息管理模块 ...

    网页短视频播客视频管理系统,框架 vs2019 + asp.net webform + sql server

    注意sql server类和access数据库可以使用vs自带的数据库启动,不需要安装庞大的sql安装包。 测试用户 qqq 123456 后台管理用户 admin 123456 模块介绍 管理员 上传电影模块 电影信息管理模块 用户信息管理模块 ...

    有安全需求的选题系统

    Session的使用要求用户浏览器必须支持Cookie,如果浏览器不支持使用Cookie,或者设置为禁用Cookie,那么将不能使用Session。Session信息对客户来说,不同的用户用不同的Session信息来记录。当用户启用Session时,...

    Java学生信息管理系统源码(含数据库脚本等).zip

    使用前请导入DumpStructureOnly.sql(数据库结构文件) 或者 DumpStructure_and_Data.sql(带有测试数据的数据库文件), 使用Navicat导入上述脚本至MySQL数据库 修改dbConn.java配置文件: 数据库端口:3306 ...

    benderco-angular-atm:https:github.combenderCOangular-atm

    该项目是使用版本10.0.5生成的。 当前的启动用户进行测试 用户名 密码 用户类型 账户余额 abc123! UserType.basic 1000000 abc123! UserType.basic 2000 abc123! UserType.admin 1000000000 abc123! ...

Global site tag (gtag.js) - Google Analytics