類型是個(gè)不錯(cuò)的選擇,如何將一個(gè)字段映射為L(zhǎng)ist類型,Hibernate并沒有提供原生支持,我們必須實(shí)現(xiàn)自己的UserType.
package com.wyq.hibernate;
public interface UserType {
/**
* 返回UserType所映射字段的SQL類型(java.sql.Types)
* 返回類型為int[],其中包含了映射各字段的SQL類型代碼
* (UserType可以映射到一個(gè)或者多個(gè)字段)
* @see java.sql.Types
* @return int[] the typecodes
*/
public int[] sqlTypes();
/**
* UserType.nullSafeGet()所返回的自定義數(shù)據(jù)類型
* @return Class
*/
public Class returnedClass();
/**
* 自定義數(shù)據(jù)類型的對(duì)比方法
* 此方法將用作臟數(shù)據(jù)檢查,參數(shù)x,y分別為數(shù)據(jù)的2個(gè)副本
* 如果equals方法返回false,則Hibernate將認(rèn)為數(shù)據(jù)發(fā)生變化,并將變化更新到庫(kù)表中
*/
public boolean equals(Object x,Object y)throws HiberanteException;
/**
* 從JDBC ResultSet讀出數(shù)據(jù),將其轉(zhuǎn)換為自定義類型后返回
* (此方法要求對(duì)可能出現(xiàn)的null值進(jìn)行處理)
* names中包含了當(dāng)前自定義類型的映射字段名稱。
*/
public Object nullSafeGet(ResultSet rs,String[] names,Object owner)throws HibernateException,SQLException;
/**
* 本方法將在Hibernate進(jìn)行數(shù)據(jù)保存時(shí)被調(diào)用
* 我們可以通過PreparedStatement將自定義數(shù)據(jù)寫入對(duì)應(yīng)的庫(kù)表字段
*/
public void nullSafeSet(PreparedStatement st,Object value,int index)throws HibernateException,SQLException;
/**
* 提供自定義類型的完全復(fù)制方法
* 本方法將用作構(gòu)造返回對(duì)象
* 當(dāng)nullSafeGet方法調(diào)用之后,我們獲得了自定義數(shù)據(jù)對(duì)象,在向用戶返回自定義數(shù)據(jù)之前,deepCopy方法將被調(diào)用,
* 它將根據(jù)自定義數(shù)據(jù)對(duì)象構(gòu)造一個(gè)完全拷貝,并將此拷貝返回給用戶使用。
* 此時(shí),我們就得到了自定義數(shù)據(jù)對(duì)象的2個(gè)版本,第一個(gè)是從數(shù)據(jù)庫(kù)讀出的原始版本,其二是我們通過deepCopy構(gòu)造的
* 復(fù)制版本,原始版本將由Hibernate負(fù)責(zé)維護(hù),復(fù)制版本將由用戶使用,原始版本用作稍后的臟數(shù)據(jù)檢查一句;Hibernate
* 將在臟數(shù)據(jù)檢查過程中將這2個(gè)版本的數(shù)據(jù)進(jìn)行比對(duì),如果數(shù)據(jù)發(fā)生了變化,則執(zhí)行對(duì)應(yīng)的持久化操作。
* 數(shù)據(jù)發(fā)生了變化,則執(zhí)行對(duì)應(yīng)的持久化操作。
*/
public Object deepCopy(Object value)throws HibernateException;
/**
* 本類型實(shí)例是否可變
*/
public boolean isMutable();
}
public interface UserType {
/**
* 返回UserType所映射字段的SQL類型(java.sql.Types)
* 返回類型為int[],其中包含了映射各字段的SQL類型代碼
* (UserType可以映射到一個(gè)或者多個(gè)字段)
* @see java.sql.Types
* @return int[] the typecodes
*/
public int[] sqlTypes();
/**
* UserType.nullSafeGet()所返回的自定義數(shù)據(jù)類型
* @return Class
*/
public Class returnedClass();
/**
* 自定義數(shù)據(jù)類型的對(duì)比方法
* 此方法將用作臟數(shù)據(jù)檢查,參數(shù)x,y分別為數(shù)據(jù)的2個(gè)副本
* 如果equals方法返回false,則Hibernate將認(rèn)為數(shù)據(jù)發(fā)生變化,并將變化更新到庫(kù)表中
*/
public boolean equals(Object x,Object y)throws HiberanteException;
/**
* 從JDBC ResultSet讀出數(shù)據(jù),將其轉(zhuǎn)換為自定義類型后返回
* (此方法要求對(duì)可能出現(xiàn)的null值進(jìn)行處理)
* names中包含了當(dāng)前自定義類型的映射字段名稱。
*/
public Object nullSafeGet(ResultSet rs,String[] names,Object owner)throws HibernateException,SQLException;
/**
* 本方法將在Hibernate進(jìn)行數(shù)據(jù)保存時(shí)被調(diào)用
* 我們可以通過PreparedStatement將自定義數(shù)據(jù)寫入對(duì)應(yīng)的庫(kù)表字段
*/
public void nullSafeSet(PreparedStatement st,Object value,int index)throws HibernateException,SQLException;
/**
* 提供自定義類型的完全復(fù)制方法
* 本方法將用作構(gòu)造返回對(duì)象
* 當(dāng)nullSafeGet方法調(diào)用之后,我們獲得了自定義數(shù)據(jù)對(duì)象,在向用戶返回自定義數(shù)據(jù)之前,deepCopy方法將被調(diào)用,
* 它將根據(jù)自定義數(shù)據(jù)對(duì)象構(gòu)造一個(gè)完全拷貝,并將此拷貝返回給用戶使用。
* 此時(shí),我們就得到了自定義數(shù)據(jù)對(duì)象的2個(gè)版本,第一個(gè)是從數(shù)據(jù)庫(kù)讀出的原始版本,其二是我們通過deepCopy構(gòu)造的
* 復(fù)制版本,原始版本將由Hibernate負(fù)責(zé)維護(hù),復(fù)制版本將由用戶使用,原始版本用作稍后的臟數(shù)據(jù)檢查一句;Hibernate
* 將在臟數(shù)據(jù)檢查過程中將這2個(gè)版本的數(shù)據(jù)進(jìn)行比對(duì),如果數(shù)據(jù)發(fā)生了變化,則執(zhí)行對(duì)應(yīng)的持久化操作。
* 數(shù)據(jù)發(fā)生了變化,則執(zhí)行對(duì)應(yīng)的持久化操作。
*/
public Object deepCopy(Object value)throws HibernateException;
/**
* 本類型實(shí)例是否可變
*/
public boolean isMutable();
}