溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Hibernate中UserType如何使用

發布時間:2021-07-14 16:57:25 來源:億速云 閱讀:189 作者:Leah 欄目:編程語言

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 類如下(里面的每個方法都是必須實現的接口方法,許多都可以復制粘貼的,不復雜):

  1. public class Email implements UserType  

  2. ...{  

  3.  

  4. // 表示本類型實例是否可變,一般是不可變  

  5. public boolean isMutable()  

  6. ...{  

  7. return false;  

  8. }  

  9.  

  10. //該類型對應的 sql 類型  

  11. public int[] sqlTypes()  

  12. ...{  

  13. return new int[]......{Types.VARCHAR};  

  14. }  

  15.  

  16. // 改類型對應的 java 類型  

  17. public Class returnedClass()  

  18. ...{  

  19. return List.class;  

  20. }  

  21.  

  22. // 完全復制的方法,由于是用戶自己定義的類型

  23. //所以hibernate并不知道要如何來復制這個類,需要用戶自己定義  

  24. public Object deepCopy(Object value)throws HibernateException  

  25. ...{  

  26. List source = (List)value;  

  27. List target = new ArrayList();  

  28. target.addAll(source);  

  29. return target;  

  30. }  

  31.  

  32. //equals方法,這個就不用多說了吧,肯定是要用戶自定義的  

  33. public boolean equals(Object x,Object y) throws HibernateException  

  34. ...{  

  35. //這部分不寫出來了,自己實現吧,這個不是我要講的重點  

  36. }  

  37.  

  38. /** *//**//*  

  39. 這才是重頭戲!nullSafeGet 和nullSafeSet 是核心所在,對數據的后期處理都在這兩個方法里面  

  40. nullSafeGet 是讀取的方法  

  41. owner 目前沒用到過。  

  42. names 是對應的數據庫列名,UserType是可以對應多個列的  

  43. */  

  44. public Object nullSafeGet(ResultSet rs,String[] names,Object owner) 
    throws HibernateException,SQLException  

  45. ...{  

  46. String value = (String)Hibernate.STRING.nullSafeGet(rs,names[0]);  

  47. if(value != null)  

  48. ...{  

  49. //把 string 拆開成 list 的代碼放在這里  

  50. }  

  51. return resultList;//得到了拆開的 郵件列表  

  52. }  

  53.  

  54. /**//*  

  55. 保存的方法  

  56. index 是那個 PreparedStatement 的參數序號,一般來說不用管直接往下傳  

  57. value 就是要保存的數據,在這邊是一個保存著 email 列表的 List  

  58. */  

  59. public void nullSafeSet(PreparedStatement st,Object value,int index) 
    throws HibernateException,SQLException  

  60. ...{  

  61. if(value != null)  

  62. ...{  

  63. String email = assemble(value);//將 List 拼合成 String 的 Email 的方法  

  64. Hibernate.STRING.nullSafeSet(st,email,index);  

  65. }  

  66. else  

  67. ...{  

  68. Hibernate.STRING.nullSafeSet(st,value,index);  

  69. }  

  70. }  

在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如何使用問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女