UserType是一个Hibernate提供的一个 接口,可以用它来自定义类型;写个简单的例子,用户有Email属性,当然为了安全考虑,我们可以允许用户设定多个email,也可以独立建立一个email,然后将其和user关联起来,但是仅仅为了一个属性,就建立一个表,从系统分配的角度来看,这样很浪费;那么我们需要自定义一个类型;看下联系的实例:
EmailList:
package com.keith;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;
public class EmailList implements UserType,java.io.Serializable {
private List emails;
private static final String SPLITTER = ";";
public int[] sqlTypes() {
return new int[] { Hibernate.STRING.sqlType() };
}
/** 从二级缓存中取这个对象数据时要调用的方法 */
public Object assemble(Serializable arg0, Object arg1)
throws HibernateException {
return arg0;
}
/** hibernate把这个数据放入二级缓存时要调用的方法 */
public Serializable disassemble(Object arg0) throws HibernateException {
return (Serializable) arg0;
}
/** 这是用于Hibernate缓存生成的快照 */
public Object deepCopy(Object value) throws HibernateException {
List sourcelist = (List) value;
List targetlist = new ArrayList();
targetlist.addAll(sourcelist);
return targetlist;
}
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;
}
public int hashCode(Object arg0) throws HibernateException {
return arg0.hashCode();
}
/** 告诉hibernate这个类型是不可变的。有微小的性能优化 */
public boolean isMutable() {
return false;
}
/** 从JDBC的ResultSet读取属性值。这个方法是在从数据库查询数据时用到。 */
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;
}
}
/** 将属性的值设置到PreparedStatement。 */
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);
}
}
/** 处理脱管对象状态的合并。 */
public Object replace(Object original, Object target, Object owner)
throws HibernateException {
return original;
}
/** 告诉Hibernate这个UserType用来映射的数据类型。 */
public Class returnedClass() {
return List.class;
}
private String assemble(List list) {
StringBuffer strBuf = new StringBuffer();
if (list.size() > 1) {
for (int i = 0; i < list.size() - 1; i++) {
strBuf.append(list.get(i)).append(SPLITTER);
}
strBuf.append(list.get(list.size() - 1));
} else if (list.size() == 1) {
strBuf.append(list.get(0));
}
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;
}
}
Tuser:
package com.keith;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class Tuser implements Serializable {
private Integer uId;
private String uName;
private List email = new ArrayList();
public Tuser() {
}
public List getEmail() {
return email;
}
public void setEmail(List email) {
this.email = email;
}
public Integer getuId() {
return uId;
}
public void setuId(Integer uId) {
this.uId = uId;
}
public String getuName() {
return uName;
}
public void setuName(String uName) {
this.uName = uName;
}
}
Tuser.hbm.xml:
<?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="com.keith"> <class name="Tuser" table="tUser"> <id name="uId" column="uId"> <generator class="native" /> </id> <property name="uName" column="uName"/> <property name="email" type="com.keith.EmailList"></property> </class> </hibernate-mapping>
测试代码:
Tuser tUser = new Tuser();
tUser.setuName("keith");
List email = new ArrayList();
email.add("keith@gmail.com");
email.add("keith@sina.coom");
tUser.setEmail(email);
session.save(tUser);
session.getTransaction().commit();
看下数据库;