Hibernate中UserType如何使用,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
1、建立數據庫的時候***建立一個跟業務邏輯完全沒有關系的id,這樣的好處就是以后當數據量大的時候可以容易的建立索引,而且當業務邏輯變化的時候底層的數據結構不用變化很大。
2、代碼的干凈是非常非常的重要的,從現在開始盡量讓自己的代碼寫的漂亮把!因為干凈的代碼不僅容易維護,而且容易發現bug,在Hibernate使用UserType是很好用的。舉個經典的例子:
實現Hibernate使用UserType接口的email 類
比如 你需要在 TUSER 表中記錄一個人的 email ,單獨為其建立一張數據庫表是很浪費資源的,一般的方法是將TUSER 一欄 varchar 的來記錄email ,多個 email 之間用 " ; "號分開,我曾經做的項目中采取的方法是:取出一個記錄著多條 email 的 string然后再來用 ; 號拆開,但是這樣子就有個不好,在一堆整齊的 get 方法用出來一個有 bad smell 的代碼。
有兩個方法,一個是修改映射TUSER的 java 類在其中增加一個 getEmail 方法,返回一個 list ,該方法對原先的 getEmail 方法進行二次處理。第二個方法就是采用UserType 。
UserType就是用戶自定義類型,這里的類型指的是除了Hibernate定義的那些類型之外的用戶自己定義的。
一個實現Hibernate使用UserType接口的 email 類如下(里面的每個方法都是必須實現的接口方法,許多都可以復制粘貼的,不復雜):
public class Email implements UserType
...{
// 表示本類型實例是否可變,一般是不可變
public boolean isMutable()
...{
return false;
}
//該類型對應的 sql 類型
public int[] sqlTypes()
...{
return new int[]......{Types.VARCHAR};
}
// 改類型對應的 java 類型
public Class returnedClass()
...{
return List.class;
}
// 完全復制的方法,由于是用戶自己定義的類型
//所以hibernate并不知道要如何來復制這個類,需要用戶自己定義
public Object deepCopy(Object value)throws HibernateException
...{
List source = (List)value;
List target = new ArrayList();
target.addAll(source);
return target;
}
//equals方法,這個就不用多說了吧,肯定是要用戶自定義的
public boolean equals(Object x,Object y) throws HibernateException
...{
//這部分不寫出來了,自己實現吧,這個不是我要講的重點
}
/** *//**//*
這才是重頭戲!nullSafeGet 和nullSafeSet 是核心所在,對數據的后期處理都在這兩個方法里面
nullSafeGet 是讀取的方法
owner 目前沒用到過。
names 是對應的數據庫列名,UserType是可以對應多個列的
*/
public Object nullSafeGet(ResultSet rs,String[] names,Object owner)
throws HibernateException,SQLException...{
String value = (String)Hibernate.STRING.nullSafeGet(rs,names[0]);
if(value != null)
...{
//把 string 拆開成 list 的代碼放在這里
}
return resultList;//得到了拆開的 郵件列表
}
/**//*
保存的方法
index 是那個 PreparedStatement 的參數序號,一般來說不用管直接往下傳
value 就是要保存的數據,在這邊是一個保存著 email 列表的 List
*/
public void nullSafeSet(PreparedStatement st,Object value,int index)
throws HibernateException,SQLException...{
if(value != null)
...{
String email = assemble(value);//將 List 拼合成 String 的 Email 的方法
Hibernate.STRING.nullSafeSet(st,email,index);
}
else
...{
Hibernate.STRING.nullSafeSet(st,value,index);
}
}
}
在TUser.hbm.xml 中如此設置:
<hibernate-mapping> <class name="entity.TUser" table="T_USER"> </class> .............. <property name = "emali"column = "email"type = "mytype.Email"/> </hibernate-mapping>
在TUser.java中如此設置
public class TUser implement Serializable ...{ private Integer id; privarte Stirng name; //看,這邊的 email 可以大膽的使用 List 了 private List email; //下面是一些 getter 和 setter 了 }
關于Hibernate中UserType如何使用問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。