UserType实例——User的Email列表

来源:互联网 发布:imagesloaded.js用法 编辑:程序博客网 时间:2024/04/27 15:36

1.实现UserType接口的EMailList自定义类型

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.apache.commons.lang.StringUtils;

import net.sf.hibernate.Hibernate;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.UserType;
import net.sf.hibernate.hql.Parser;

/**
 * @author hy-he
 *
 */
public class EMailList implements UserType {
 private List emails;
 private static final String SPLITTER = ";";
 private static final int[] TYPES = new int[]{
  Types.VARCHAR
 };
 /* (non-Javadoc)
  * @see net.sf.hibernate.UserType#sqlTypes()
  */
 public int[] sqlTypes() {
  // TODO Auto-generated method stub
  return TYPES;
 }

 /* (non-Javadoc)
  * @see net.sf.hibernate.UserType#returnedClass()
  */
 public Class returnedClass() {
  // TODO Auto-generated method stub
  return List.class;
 }

 /* (non-Javadoc)
  * @see net.sf.hibernate.UserType#equals(java.lang.Object, java.lang.Object)
  */
 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 str1 = (String)xList.get(i);
    String str2 = (String)yList.get(i);
    if(!str1.equals(str2)) return false;
   }
   return true;
  }
  return false;
 }

 /* (non-Javadoc)
  * @see net.sf.hibernate.UserType#nullSafeGet(java.sql.ResultSet, java.lang.String[], java.lang.Object)
  */
 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;
  }
 }

 /* (non-Javadoc)
  * @see net.sf.hibernate.UserType#nullSafeSet(java.sql.PreparedStatement, java.lang.Object, int)
  */
 public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
  System.out.println("Set method excecuted");
  if(value != null){
   String str = assemble((List)value);
   Hibernate.STRING.nullSafeSet(st,str,index);
  }else{
   Hibernate.STRING.nullSafeSet(st,value,index);
  }

 }

 /* (non-Javadoc)
  * @see net.sf.hibernate.UserType#deepCopy(java.lang.Object)
  */
 public Object deepCopy(Object value) throws HibernateException {
  List sourcelist = (List)value;
  List targetlist = new ArrayList();
  targetlist.addAll(sourcelist);
  return targetlist;
 }

 /* (non-Javadoc)
  * @see net.sf.hibernate.UserType#isMutable()
  */
 public boolean isMutable() {
  // TODO Auto-generated method stub
  return false;
 }
 private String assemble(List emailList){
  StringBuffer strBuf = new StringBuffer();
  for(int i = 0;i<emailList.size()-1;i++){
   strBuf.append(emailList.get(i)).append(SPLITTER);
  }
  strBuf.append(emailList.get(emailList.size()-1));
  return strBuf.toString();
 }
 private List parse(String value){
  String[] strs = StringUtils.split(value,SPLITTER);
  List emailList = new ArrayList();
  for(int i = 0;i<strs.length;i++){
   emailList.add(strs[i]);
  }
  return emailList;
 }
}

2.POJO:


import java.io.Serializable;
import java.util.List;

/**
 * @author hy-he
 * @hibernate.class
 * table = "USER_TYPE_USER"
 */
public class UserTypeUser implements Serializable {
 private Long id;
 private String name;
 private Integer age;
 private List email = new ArrayList();
 /**
  * @hibernate.id
  * column = "USER_ID"
  * generator-class = "increment"
  * @return
  */
 public Long getId() {
  return id;
 }
 /**
  * @hibernate.property
  * column = "AGE"
  * @return
  */
 public Integer getAge() {
  return age;
 }
 /**
  * @hibernate.property
  * column = "EMAIL"
  * type = "hibernate.usertype.EMailList"
  * @return
  */
 public List getEmail() {
  return email;
 }
 /**
  * @hibernate.property
  * column = "NAME"
  * @return
  */
 public String getName() {
  return name;
 }
 public void setAge(Integer age) {
  this.age = age;
 }
 public void setEmail(List email) {
  this.email = email;
 }
 public void setId(Long id) {
  this.id = id;
 }
 public void setName(String name) {
  this.name = name;
 }
 
}
3.xml:

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
    <class
        name="hibernate.usertype.UserTypeUser"
        table="USER_TYPE_USER"
        dynamic-update="false"
        dynamic-insert="false"
    >

        <id
            name="id"
            column="USER_ID"
            type="java.lang.Long"
        >
            <generator class="increment">
            </generator>
        </id>

        <property
            name="age"
            type="java.lang.Integer"
            update="true"
            insert="true"
            access="property"
            column="AGE"
        />

        <property
            name="email"
            type="hibernate.usertype.EMailList"
            update="true"
            insert="true"
            access="property"
            column="EMAIL"
        />

        <property
            name="name"
            type="java.lang.String"
            update="true"
            insert="true"
            access="property"
            column="NAME"
        />

        <!--
            To add non XDoclet property mappings, create a file named
                hibernate-properties-UserTypeUser.xml
            containing the additional properties and place it in your merge dir.
        -->

    </class>

</hibernate-mapping>
4.运用:

insert方法:

public static void insertUser() throws HibernateException {
  UserTypeUser user = new UserTypeUser();
  user.setAge(new Integer(23));
  user.setName("Test UserType");
  user.getEmail().add("rever@hotmail.com");
  user.getEmail().add("rever1@hotmail.com");
  user.getEmail().add("rever2@hotmail.com");
  user.getEmail().add("rever3@hotmail.com");
  Session session = HibernateUtil.currentSession();
  Transaction tx = session.beginTransaction();
  session.save(user);

  tx.commit();
  HibernateUtil.closeSession();
 }

display方法:

 public static void display() throws HibernateException {
  Session session = HibernateUtil.currentSession();
  List users = session.find("from UserTypeUser");
  HibernateUtil.closeSession();

  for (ListIterator iterator = users.listIterator(); iterator.hasNext();) {
   UserTypeUser pu = (UserTypeUser) iterator.next();
   System.out.println(pu.getName());
   List emails = pu.getEmail();
   for(int i = 0;i<emails.size();i++){
    System.out.println(emails.get(i));
   }
  }
 }

原创粉丝点击