Hibernate自定义类型 -类属性类型与数据库类型转换


 看到网上有很多举自定义类型的例子,都是用的用户的多个邮箱的例子,那么我的也是用的这个例子作为背景。

其实,自定义类型,就是定义一个实现UserType接口的类,规定是如何由类中的类型转为数据库的类型,如何由数据库的类型转为类中的类型。

最主要的就是两个方法:nullSafeGet和nullSafeSet。

如下:

[java]  view plain copy
  1. package com.learn.hibernate.model;  
  2. import java.io.Serializable;  
  3. import java.sql.PreparedStatement;  
  4. import java.sql.ResultSet;  
  5. import java.sql.SQLException;  
  6. import java.sql.Types;  
  7. import org.hibernate.*;  
  8. import org.hibernate.usertype.UserType;  
  9. import java.util.*;  
  10. public class MailList implements UserType{  
  11.   
  12.     private List mail;  
  13.     private final int[] types=new int[]{Types.VARBINARY};  
  14.     @Override  
  15.     public Object assemble(Serializable arg0, Object arg1)  
  16.             throws HibernateException {  
  17.         // TODO Auto-generated method stub  
  18.         return arg0;  
  19.     }  
  20.   
  21.     @Override  
  22.     public Object deepCopy(Object arg0) throws HibernateException {  
  23.         // TODO Auto-generated method stub  
  24.         return arg0;  
  25.     }  
  26.   
  27.     @Override  
  28.     public Serializable disassemble(Object arg0) throws HibernateException {  
  29.         // TODO Auto-generated method stub  
  30.         return (Serializable)arg0;  
  31.     }  
  32.   
  33.     @Override  
  34.     public boolean equals(Object arg0, Object arg1) throws HibernateException {  
  35.         // TODO Auto-generated method stub  
  36.         return (arg0==arg1);  
  37.     }  
  38.   
  39.     @Override  
  40.     public int hashCode(Object arg0) throws HibernateException {  
  41.         // TODO Auto-generated method stub  
  42.         return arg0.hashCode();  
  43.     }  
  44.   
  45.     @Override  
  46.     public boolean isMutable() {  
  47.         // TODO Auto-generated method stub  
  48.         return false;  
  49.     }  
  50.   
  51.     //从数据库中读出,获得Mail的List  
  52.     @Override  
  53.     public Object nullSafeGet(ResultSet arg0, String[] arg1, Object arg2)  
  54.             throws HibernateException, SQLException {  
  55.         // TODO Auto-generated method stub  
  56.         String mail_str=(String)Hibernate.STRING.nullSafeGet(arg0,arg1[0]);  
  57.         List temp=new ArrayList<String>();  
  58.         if(mail_str==null)  
  59.         {  
  60.             return null;  
  61.         }  
  62.         else  
  63.         {  
  64.             String[] strs=mail_str.split(",");  
  65.             for(int i=0;i<strs.length;i++)  
  66.             {  
  67.                 temp.add(strs[i]);  
  68.             }  
  69.             return temp;  
  70.         }  
  71.     }  
  72.   
  73.     //将类变为数据库的类型  
  74.     @Override  
  75.     public void nullSafeSet(PreparedStatement arg0, Object arg1, int arg2)  
  76.             throws HibernateException, SQLException {  
  77.         // TODO Auto-generated method stub  
  78.         if(arg1!=null)  
  79.         {  
  80.             List value=(List)arg1;  
  81.             String temp="";  
  82.             for(int i=0;i<value.size();i++)  
  83.             {  
  84.                 if(i<value.size()-1)  
  85.                 {  
  86.                     temp+=value.get(i)+",";  
  87.                 }  
  88.                 else  
  89.                 {  
  90.                     temp+=value.get(i);  
  91.                 }  
  92.             }  
  93.             Hibernate.STRING.nullSafeSet(arg0,temp,arg2);  
  94.         }  
  95.     }  
  96.   
  97.     @Override  
  98.     public Object replace(Object arg0, Object arg1, Object arg2)  
  99.             throws HibernateException {  
  100.         // TODO Auto-generated method stub  
  101.         return arg0;  
  102.     }  
  103.   
  104.     @Override  
  105.     public Class returnedClass() {  
  106.         // TODO Auto-generated method stub  
  107.         return mail.getClass();  
  108.     }  
  109.   
  110.     @Override  
  111.     public int[] sqlTypes() {  
  112.         // TODO Auto-generated method stub  
  113.         return types;  
  114.     }  
  115. }  


Myuser类如下:

[java]  view plain copy
  1. package com.learn.hibernate.model;  
  2. import java.io.Serializable;  
  3. import java.util.*;  
  4. public class Myuser implements Serializable{  
  5.   
  6.     private int id;  
  7.     public String username;  
  8.     public List mail;  
  9.       
  10.     public void setId(Integer id)  
  11.     {  
  12.         this.id=id;  
  13.     }  
  14.     public Integer getId()  
  15.     {  
  16.         return this.id;  
  17.     }  
  18.     public void setUsername(String username)  
  19.     {  
  20.         this.username=username;  
  21.     }  
  22.     public String getUsername()  
  23.     {  
  24.         return this.username;  
  25.     }  
  26.     public void setMail(List mail)  
  27.     {  
  28.         this.mail=mail;  
  29.     }  
  30.     public List getMail()  
  31.     {  
  32.         return this.mail;  
  33.     }  
  34. }  

映射配置如下:

[html]  view plain copy
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="org.hibernate.tutorial.domain">  
  6. <class name="com.learn.hibernate.model.Myuser" table="myuser">  
  7. <meta attribute="sync-DAO">false</meta>  
  8. <id name="id" type="int">  
  9.      <generator class="identity"/>  
  10. </id>  
  11. <property name="username" type="string"/>  
  12. <property name="mail" type="com.learn.hibernate.model.MailList"/>  
  13. </class>  
  14. </hibernate-mapping>  
[html]  view plain copy
  1.    

最后就是测试的文件(包括插入数据库和查询数据库):

[java]  view plain copy
  1. import java.io.Serializable;  
  2. import java.sql.PreparedStatement;  
  3. import java.sql.ResultSet;  
  4. import java.sql.SQLException;  
  5. import org.hibernate.*;  
  6. import org.hibernate.usertype.UserType;  
  7. import com.learn.hibernate.model.Myuser;  
  8. import java.util.*;  
  9. public class MyUserTest{  
  10.   
  11.     //保存  
  12.     public void insertMyuser()  
  13.     {  
  14.         SessionFactory sessionFactory=SessionFactoryUtil.buildSessionFactory();  
  15.         Session session=sessionFactory.openSession();  
  16.         List mail=new ArrayList<String>();  
  17.         mail.add("11@sohu.com");  
  18.         mail.add("11@qq.com");  
  19.           
  20.         Myuser user=new Myuser();  
  21.         user.setUsername("某人");  
  22.         user.setMail(mail);  
  23.           
  24.         Transaction tran=session.beginTransaction();  
  25.         session.save(user);  
  26.         tran.commit();  
  27.         session.close();  
  28.         sessionFactory.close();  
  29.           
  30.         System.out.println("保存成功!");  
  31.     }  
  32.     //查询  
  33.     public void queryData()  
  34.     {  
  35.         SessionFactory sessionFactory=SessionFactoryUtil.buildSessionFactory();  
  36.         Session session=sessionFactory.openSession();  
  37.         Query query=session.createQuery("from Myuser where username=:username");  
  38.         query.setString("username","某人");  
  39.         List users=query.list();  
  40.         if(users!=null)  
  41.         {  
  42.             Myuser user=(Myuser)users.get(0);  
  43.             List mails=user.getMail();  
  44.             for(int i=0;i<mails.size();i++)  
  45.             {  
  46.                 System.out.println(mails.get(i));  
  47.             }  
  48.         }  
  49.         session.close();  
  50.         sessionFactory.close();  
  51.     }  
  52.     public static void main(String[] args)  
  53.     {  
  54.         MyUserTest te=new MyUserTest();  
  55.         //te.insertMyuser();  
  56.         te.queryData();  
  57.     }  
  58. }  


PS:建立myuser表的SQL语句为:

create table myuser
(
id int identity(1,1) primary key,
username varchar(50),
mail varchar(255)
)

原文地址:http://blog.csdn.net/rongyongfeikai2/article/details/6619622

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值