EmailListType1.java:
package basicCar.bean;
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.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;
/**
* 自定义数据类型
*
* @author afei
*
*/
public class EmailListType1 implements UserType {
private List emails;
private static final String SPLITTER = ";";
private static final int[] TYPES = new int[] { Types.VARCHAR };
/**
* 深度copy一个副本给用户使用,脏数据检查时候发现不相同,会执行相应的持久化操作 在这里创建一个新的list,包含原来的所有元素
*/
@Override
public Object deepCopy(Object value) throws HibernateException {
List sourcelist = (List) value;
List targetlist = new ArrayList();
if(sourcelist!=null){
targetlist.addAll(sourcelist);
}
return targetlist;
}
@Override
public Serializable disassemble(Object arg0) throws HibernateException {
System.out.println("disassemble()");
return null;
}
/**
* 此方法用户账数据检查,假如返回false,则认为数据发生变化,并将变化更新到库表中 这里判断email list是否发生改变
*/
@Override
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 strx = (String) xList.get(i);
String stry = (String) yList.get(i);
if (!(strx.equals(stry)))
return false;
}
return true;
}
return false;
}
@Override
public int hashCode(Object arg0) throws HibernateException {
// TODO Auto-generated method stub
return 0;
}
/**
* 本类型实例是否可变
*/
@Override
public boolean isMutable() {
return false;
}
/**
* 从JDBC ResultSet读取数据,将其转换为自定义类型后返回 (此方法要求对可能出现的null值进行处理)
* names中包含了当前自定义类型的映射字段名称
*/
@Override
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;
}
}
/**
* 自定义方法,将";"分隔的字符串解析为一个字符串数组
* @return
*/
private List parse(String value){
String[] args=value.split(SPLITTER);
List<String> emailList=new ArrayList<String>();
for(String email:args){
emailList.add(email);
}
return emailList;
}
/**
* 本方法将在hibernate进行数据保存时调用 我们可以通过PreparedStatement将自定义数据写入对应的库表字段
* 将List型的email用";"分隔后存入数据库
*/
@Override
public void nullSafeSet(PreparedStatement ps, Object value, int index)
throws HibernateException, SQLException {
if(value!=null){
Object str=this.assemble((List)value);
Hibernate.STRING.nullSafeSet(ps,str,index);
}else{
Hibernate.STRING.nullSafeSet(ps,value,index);
}
}
@Override
public Object assemble(Serializable str, Object emailList)
throws HibernateException {
return null;
}
/**
* 以字符串拼接
*/
public String assemble(List emailList)
throws HibernateException {
String str="";
for(Object email:emailList){
if(str.equals("")){
str=(String)email;
}else{
str=str+SPLITTER+(String)email;
}
}
System.out.println("assemble");
return str;
}
@Override
public Object replace(Object arg0, Object arg1, Object arg2)
throws HibernateException {
// TODO Auto-generated method stub
return null;
}
/**
* UserType.nullSafeGet()所返回的自定义数据类型
*/
@Override
public Class returnedClass() {
return List.class;
}
/**
* 返回UserType所映射字段的类型(java.sql.Types) 返回类型为int[],其中包含了映射各字段的SQL类型代码
* (UserType可以映射到一个或多个字段)
*/
@Override
public int[] sqlTypes() {
// TODO Auto-generated method stub
return TYPES;
}
}
Customer.java:
private List email; //自定义值类型,同一张表里面,用List存储,以“;”分开每条eamil数据
//自定义值类型,eamil
public List getEmail() {
return email;
}
public void setEmail(List email) {
this.email = email;
}
Customer.hbm.xml:
<!--
集合元素,List
-->
<list name="aliases" table="alias">
<key column="aliasId"/>
<list-index column="indexName" base="5"/>
<element column="aliasName" type="string" />
</list>
Test.java:
void saveEntity() {
//自定义值类型,邮箱
java.util.List list = new ArrayList();
list.add("小明小明@123.com");
list.add("小明小明@123.com");
//Customer ss = new Customer(300,"小白","北京");
Customer ss = (Customer) session.load(Customer.class, new Long(300));
ss.setEmail(list);
session.save(ss);
}
void queryEntity() {
//测试自定义类型,邮箱
if(customer.getEmail()!=null)
{
//String ie = customer.getEmail();
Iterator it2 = customer.getEmail().iterator();
while(it2.hasNext())
{
String email = (String)it2.next();
System.out.println("邮箱 :" + email);
}
}
}