看到网上有很多举自定义类型的例子,都是用的用户的多个邮箱的例子,那么我的也是用的这个例子作为背景。
其实,自定义类型,就是定义一个实现UserType接口的类,规定是如何由类中的类型转为数据库的类型,如何由数据库的类型转为类中的类型。
最主要的就是两个方法:nullSafeGet和nullSafeSet。
如下:
- package com.learn.hibernate.model;
- import java.io.Serializable;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Types;
- import org.hibernate.*;
- import org.hibernate.usertype.UserType;
- import java.util.*;
- public class MailList implements UserType{
- private List mail;
- private final int[] types=new int[]{Types.VARBINARY};
- @Override
- public Object assemble(Serializable arg0, Object arg1)
- throws HibernateException {
- // TODO Auto-generated method stub
- return arg0;
- }
- @Override
- public Object deepCopy(Object arg0) throws HibernateException {
- // TODO Auto-generated method stub
- return arg0;
- }
- @Override
- public Serializable disassemble(Object arg0) throws HibernateException {
- // TODO Auto-generated method stub
- return (Serializable)arg0;
- }
- @Override
- public boolean equals(Object arg0, Object arg1) throws HibernateException {
- // TODO Auto-generated method stub
- return (arg0==arg1);
- }
- @Override
- public int hashCode(Object arg0) throws HibernateException {
- // TODO Auto-generated method stub
- return arg0.hashCode();
- }
- @Override
- public boolean isMutable() {
- // TODO Auto-generated method stub
- return false;
- }
- //从数据库中读出,获得Mail的List
- @Override
- public Object nullSafeGet(ResultSet arg0, String[] arg1, Object arg2)
- throws HibernateException, SQLException {
- // TODO Auto-generated method stub
- String mail_str=(String)Hibernate.STRING.nullSafeGet(arg0,arg1[0]);
- List temp=new ArrayList<String>();
- if(mail_str==null)
- {
- return null;
- }
- else
- {
- String[] strs=mail_str.split(",");
- for(int i=0;i<strs.length;i++)
- {
- temp.add(strs[i]);
- }
- return temp;
- }
- }
- //将类变为数据库的类型
- @Override
- public void nullSafeSet(PreparedStatement arg0, Object arg1, int arg2)
- throws HibernateException, SQLException {
- // TODO Auto-generated method stub
- if(arg1!=null)
- {
- List value=(List)arg1;
- String temp="";
- for(int i=0;i<value.size();i++)
- {
- if(i<value.size()-1)
- {
- temp+=value.get(i)+",";
- }
- else
- {
- temp+=value.get(i);
- }
- }
- Hibernate.STRING.nullSafeSet(arg0,temp,arg2);
- }
- }
- @Override
- public Object replace(Object arg0, Object arg1, Object arg2)
- throws HibernateException {
- // TODO Auto-generated method stub
- return arg0;
- }
- @Override
- public Class returnedClass() {
- // TODO Auto-generated method stub
- return mail.getClass();
- }
- @Override
- public int[] sqlTypes() {
- // TODO Auto-generated method stub
- return types;
- }
- }
Myuser类如下:
- package com.learn.hibernate.model;
- import java.io.Serializable;
- import java.util.*;
- public class Myuser implements Serializable{
- private int id;
- public String username;
- public List mail;
- public void setId(Integer id)
- {
- this.id=id;
- }
- public Integer getId()
- {
- return this.id;
- }
- public void setUsername(String username)
- {
- this.username=username;
- }
- public String getUsername()
- {
- return this.username;
- }
- public void setMail(List mail)
- {
- this.mail=mail;
- }
- public List getMail()
- {
- return this.mail;
- }
- }
映射配置如下:
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping package="org.hibernate.tutorial.domain">
- <class name="com.learn.hibernate.model.Myuser" table="myuser">
- <meta attribute="sync-DAO">false</meta>
- <id name="id" type="int">
- <generator class="identity"/>
- </id>
- <property name="username" type="string"/>
- <property name="mail" type="com.learn.hibernate.model.MailList"/>
- </class>
- </hibernate-mapping>
最后就是测试的文件(包括插入数据库和查询数据库):
- import java.io.Serializable;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import org.hibernate.*;
- import org.hibernate.usertype.UserType;
- import com.learn.hibernate.model.Myuser;
- import java.util.*;
- public class MyUserTest{
- //保存
- public void insertMyuser()
- {
- SessionFactory sessionFactory=SessionFactoryUtil.buildSessionFactory();
- Session session=sessionFactory.openSession();
- List mail=new ArrayList<String>();
- mail.add("11@sohu.com");
- mail.add("11@qq.com");
- Myuser user=new Myuser();
- user.setUsername("某人");
- user.setMail(mail);
- Transaction tran=session.beginTransaction();
- session.save(user);
- tran.commit();
- session.close();
- sessionFactory.close();
- System.out.println("保存成功!");
- }
- //查询
- public void queryData()
- {
- SessionFactory sessionFactory=SessionFactoryUtil.buildSessionFactory();
- Session session=sessionFactory.openSession();
- Query query=session.createQuery("from Myuser where username=:username");
- query.setString("username","某人");
- List users=query.list();
- if(users!=null)
- {
- Myuser user=(Myuser)users.get(0);
- List mails=user.getMail();
- for(int i=0;i<mails.size();i++)
- {
- System.out.println(mails.get(i));
- }
- }
- session.close();
- sessionFactory.close();
- }
- public static void main(String[] args)
- {
- MyUserTest te=new MyUserTest();
- //te.insertMyuser();
- te.queryData();
- }
- }
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