Hibernate學習筆記(五)對映元件屬性

2021-07-02 00:43:27 字數 3828 閱讀 2630

元件屬性的意思是:非基本資料型別、字串、日期等型別,而是乙個復合型別的物件,在持久化的過程中,它僅僅當作值型別,而並非引用另乙個持久化實體。

如下例項:

元件屬性無法用元素來對映(如上面的name屬性)。上面的name類中包含乙個owner屬性,該owner屬性指向包含該name屬性的容器實體(也就是person物件)。

1、為了對映元件屬性,需要使用元素。下面介紹元素常見的一下屬性:

name:指定該元件屬性的名稱。

class:指定元件類的類名。可以不指定,不指定的話,hibernate通過反射來得到該元件的型別。

insert:指定被對映的字段是否出現在sql的insert語句中。

update:指定被對映的字段是否出現在sql的update語句中。

access:指定hibernate訪問該元件屬性的訪問策略,預設是property。

lazy:設定該元件是否在持久化物件第一次被訪問時啟用延遲載入,預設是true。

optimistic-lock:設定更新該元件屬性是否需要獲取樂觀鎖,如果該屬性設定為true,則當修改該元件屬性時,持久化物件的版本號會增加。

unique:指定是否在該元件對映的所有欄位上新增唯一性約束。

2、元素的子元素:

:這裡的子元素與元素下的子元素用法完全相似。

:用於對映元件類內乙個指向其容器實體的引用,該元素只有乙個name屬性,其值為引用容器實體的屬性名。

:如果元件屬性仍然是元件,則在元素裡再次使用子元素進行對映。

集合對映元素:如果元件型別裡的屬性時陣列型別,集合型別等,可以在裡使用、、等子元素來對映這些集合屬性。

關聯對映元素:如果元件屬性裡的屬性時另外乙個持久化例項的應用,還可以在裡使用、等子元素,這就變成了hibernate關聯對映中的一種特例了。

3、對於只包含普通標量屬性的元件型別而言,hibernate的處理策略非常簡單,元件裡每個屬性對映乙個資料列即可。

元件屬性為集合:

元件屬性為集合,上篇文章中介紹集合屬性的對映配置是一樣的,沒有任何區別。

集合屬性的元素為元件:

集合中除了可以存放基本型別、字串、日期型別外,還能存放元件物件(也就是符合型別)。和對映集合屬性類似,只是將、、、元素下的子元素改為子元素。需要指定乙個class屬性,值為集合裡組建物件的型別。

元素和元素用法非常相似:

如果元件的屬性是基本型別、字串和日期型別,使用子元素對映這些屬性。

如果元件的屬性又是元件型別,則使用元素對映這些巢狀元件屬性。

如果元件的屬性引用其他持久化實體,則應使用元素來對映該屬性。

元素也可以接受子元素來引用包含該元件屬性的持久化實體。

注意:hibernate不允許元素裡再使用集合對映,如等集合對映,否則對映關係無線複雜。

元件作為map的索引:

1、map集合可以允許使用復合型別物件作為map的key值,hibernate使用來對映符合型別的key(回憶以下:基礎型別的key使用來對映的)。元素需要class屬性來表示key的類名。

2、可以下列兩個子元素:

:當元件裡的屬性是基本型別、字串、日期型別時,使用該元素來對映這些屬性即可。

:當元件裡的屬性時對其他持久化實體的引用時,則使用該元素來對映這些屬性,這也是一種關聯對映。

3、元素的子元素可視為一種特殊的元素,它一樣可以接受name、access、type、column、length等屬性,這些屬性的作用和元素中的完全一樣。

4、由於map key的特殊性,所以程式必須重寫該元件類的equals()和hashcode()方法。

示例如下:

pojo類:

public class personpublic class namepublic name() 

//省略getter 和 setter方法

}

public class name2 

if (obj != null

&& obj.getclass() == name2.class)

}return false;

} //重寫hashcode方法,根據first、last計算hashcode值

public int hashcode()

}

對映檔案(person.hbm.xml):

測試類為:

public class personmanager 

public void setage(int age)

public name getname()

public void setname(name name)

}

要求name必須實現serializable介面,且實現equals和hashcode方法

public class name implements serializable

public name()

public string getfirst()

public void setfirst(string first)

public string getlast()

public void setlast(string last)

//重寫equals方法,根據first、last進行判斷

public boolean equals(object obj)

if (obj != null

&& obj.getclass() == name.class)

}return false;

} //重寫hashcode方法,根據first、last計算hashcode值

public int hashcode()

}

對映主鍵是,如果主鍵是元件的話,使用composite-id代替id元素,使用key-property對映元件中的基礎屬性

測試類:

public class personmanager 

}

測試類允許後,生成表,如果所示,

多列作為聯合主鍵:

和上面元件作為復合主鍵相似,只是去掉元素中的name和class屬性。

public class person implements serializable

public void setage(int age)

public string getfirst()

public void setfirst(string first)

public string getlast()

public void setlast(string last)

//重寫equals方法,根據first、last進行判斷

public boolean equals(object obj)

if (obj != null

&& obj.getclass() == name.class)

}return false;

}//重寫hashcode方法,根據first、last計算hashcode值

public int hashcode()

}

需要持久化類實現serializable介面並重寫equals和hashcode方法,去掉composite-id的name和class屬性。

Spring動態載入Hibernate對映檔案

近來還在整通用的業務系統框架,採用外掛程式的方式載入需要的配置,之前已實現了spring和struts2配置的動態載入,現在剩下hibernate的對映檔案動態載入還沒實現,於是搜資料查原始碼終於實現之。1 重寫sessionfactory類 新建乙個類,繼承org.springframework....

Hibernate學習筆記(五) 對映組成關係

標配 base html view plain copy class name mypack.people table people idname id type long column id generator class increment id property name name type ...

學習hibernate筆記

1.首先要配置hibernate.xml 配置檔案,然後建立每個實體類的對映檔案 x.hbm.xml。2.準備工作做好之後,在寫測試類時先要拿到configuration cfg org.cfg.configuration 用來讀配置檔案的 然後通過cfg.configur返回乙個 找到配置檔案自身...