學習hibernate有段時間了,最近複習這門技術時看到了自定義使用者類的使用。個人認為這個知識點比較重要,現總結下,供以後自己回顧時看。
hibernate支援的型別已經基本上能滿足使用者的各方面需求,但有些存放進資料庫的資料並不能直接拿來放頁面顯示,必須經過一定格式的轉換,最典型的例子就是多個email的儲存問題。使用者在頁面可以同時輸入多個email資訊,如果在資料庫中定義多個varchar型別的email欄位顯然是不必要的。資料庫中只需要定義乙個email欄位即可。這其中多個email存到乙個email欄位的過程大可寫個公共方法進行email字串的組裝和拆分,但每次使用該字段時都要呼叫該公共方法就顯得麻煩了。這個時候使用hibernate的usertype類就可以很好的完成這樣的任務。
org.hibernate.usertype.usertype是乙個介面,原始碼如下:
public inte***ce usertype
實現的emailtype類**如下:
public class emailtype implements usertype ;
//該方法宣告的型別與資料庫相應字段定義的型別一致。在這裡,資料庫中定義的email欄位型別為varchar型別
public int sqltypes()
//設定成nullsafeget方法的返回值
public class returnedclass()
//用於資料對比,如果hibernate資料改變返回false。當為false時,會將變化入庫。
public boolean equals(object obj1, object obj2) throws hibernateexception
if(obj1 != null && obj2 != null)
for (int i = 0; i < list1.size(); i++)
}return true;
}return true;}
public int hashcode(object arg0) throws hibernateexception
//將資料庫的字串拆分成陣列傳給po
public object nullsafeget(resultset rs, string names, object arg2) throws hibernateexception, sqlexception else }
//將email資料合成字串存入資料庫。當deepcopy方法返回false時將呼叫該方法。
public void nullsafeset(preparedstatement pstat, object obj, int index) throws hibernateexception, sqlexception else }
//複製該物件,原物件由hibernate管理,副本物件用於判斷物件是否發生變化時用
public boolean ismutable()
public serializable disassemble(object arg0) throws hibernateexception
public object assemble(serializable arg0, object arg1) throws hibernateexception
public object replace(object arg0, object arg1, object arg2) throws hibernateexception }
當程式執行select操作時,系統會先呼叫nullsafeget方法,將值傳入po中,接著呼叫deepcopy生成物件副本供之後比較物件用。
當程式執行insert操作時,系統會先進行deepcopy,然後再呼叫nullsafeset方法。
光實現usertype類還不行,必須在email所在的對映檔案中進行配置,**如下:
其中email屬性的type就是使用者自定義型別。
自定義使用者模型類 遷移使用者模型類
django.contrib.auth1.包含認證框架的核心和預設的模型。django認證系統包含的內容 使用者 使用者模型類 使用者認證。許可權 標識乙個使用者是否可以做乙個特定的任務,mis系統常用到。組 對多個具有相同許可權的使用者進行統一管理,mis系統常用到。密碼 乙個可配置的密碼雜湊系統...
C 實現使用者自定義類
本例以自定義類 mystring 為例子,可以說,這是說接觸c 以來第一次覺得這語言好玩有趣的地方,感覺非常有微妙性!void fun1 int n case 2 case 3 int mystring countobj 0 int mystring getcountobj mystring mys...
自定義使用者控制項
和做乙個web 窗體一樣,只是,如果引用其中的控制項的方法是如何?以下示例是asp.net 1.1裡的,2.0是怎麼引用,還沒有看書呢 string getddlyear,getddllc,getddladd,getddlpeopso getddlyear class ddlyear this.fi...