看到网上有很多举自定义类型的例子,都是用的用户的多个邮箱的例子,那么我的也是用的这个例子作为背景。
其实,自定义类型,就是定义一个实现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)
)