Hibernate自定义类型

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

其实,自定义类型,就是定义一个实现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)
)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值