ORM--UserType--Hibernate4.0注解版

使用Hibernate很长时间了,现在把一些内容自己小结一下。

这里介绍Hibernate使用UserType,UserType就是用户自定义类型,这里的类型指的是除了Hibernate定义的那些类型之外的用户自己定义的。

一般情况下,Hibernate定义的类型是完全足够我们使用的。(就我自己而言,尽量不要自己去定义UserType)

User类中通过@TypeDef可以指定UserType,通过@TypeDefs可以定义多个@TypeDef。

通过@Type指定对User.emaillist是自定义类型emalilist

在具体实现上将原本已List方式存放的email地址,按照以";"为分隔存储到了数据库中。

import java.io.Serializable;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.Table;
import org.hibernate.annotations.Type;
@TypeDefs(
{
 @TypeDef(
   name = "emailList",
   defaultForType = List.class,
   typeClass = Email.class
 )
}
)
@Entity
@Table(name = "user_info")
public class User implements Serializable {
	private String id;
	private String userName;

	@Type(type = "emailList")
	private List emaillist;

	public List getEmaillist() {
		return emaillist;
	}

	public void setEmaillist(List emaillist) {
		this.emaillist = emaillist;
	}
}

@TypeDef 中的typeClass=Email.class,Email类需要实现UserType接口。

以下是Email.class的实现。

public class Email implements UserType {
	
	
	@Override
	public Object assemble(Serializable arg0, Object arg1)
			throws HibernateException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object deepCopy(Object arg0) throws HibernateException {
		
		if(arg0!=null){
			List source =(List)arg0;
			List target =new ArrayList();
			target.addAll(source);
			return target;
		}
		else{
			return arg0;
		}
		
	}

	@Override
	public Serializable disassemble(Object arg0) throws HibernateException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public boolean equals(Object arg0, Object arg1) throws HibernateException {
		
		if(arg0==null && arg1==null){
			return true;
		}
		else if(arg0!=null && arg1!=null){
			List a =(List)arg0;
			List b=(List)arg1;
			
			if(a.size()!=b.size()) return false;
			for(int i=0;i<a.size();i++){
				if(a.get(i).equals(b.get(i))==false) return false;
			}
			return true;
		}
		else{
			return false;
		}
	}

	@Override
	public int hashCode(Object arg0) throws HibernateException {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public boolean isMutable() {
		// TODO Auto-generated method stub
		return false;
	}
	
	/**
	 * 方法从ResultSet中,获取数据集,并转换成自定义格式。
	 */
	@Override
	public Object nullSafeGet(ResultSet rs, String[] name,
			SessionImplementor session, Object arg3) throws HibernateException,
			SQLException {
			
			for(String one : name){
				System.out.println("name="+one);
			}
		
			String str= (String) StringType.INSTANCE.get(rs, name[0], session);
			
			List emailList=null;
			if(str!=null){
				emailList=new ArrayList();
				for(String one:str.split(";")){
					emailList.add(one);
				}
			}
			
		return emailList;
	}
	
	/**
	 * 将对象属性放入到字段中
	 */
	@Override
	public void nullSafeSet(PreparedStatement st, Object arg1, int index,
			SessionImplementor session) throws HibernateException, SQLException {
		if(arg1!=null){
			List emailList=(List)arg1;
			StringBuilder sb=new StringBuilder();
			for(int i=0;i<emailList.size()-1;i++){
				sb.append(emailList.get(i)).append(";");
			}
			sb.append(emailList.get(emailList.size()-1));
			
			StringType.INSTANCE.nullSafeSet(st, sb.toString(), index, session);
		}
		else{
			StringType.INSTANCE.nullSafeSet(st, arg1, index, session);
		}
	}

	@Override
	public Object replace(Object arg0, Object arg1, Object arg2)
			throws HibernateException {
		// TODO Auto-generated method stub
		return null;
	}
	
	/**
	 * 对应的对象属性的类型
	 */
	@Override
	public Class returnedClass() {
		// TODO Auto-generated method stub
		return List.class;
	}
	
	
	/**
	 * 对应的sql类型,也就是实际的对象属性对应的SQL类型。
	 */
	@Override
	public int[] sqlTypes() {
		
		return new int[]{Types.VARCHAR};
	}

}


以上代码参考与摘录了 夏昕《深入浅出Hibernate》

转载于:https://my.oschina.net/have2cow/blog/156109

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值