国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - hibernate中的對(duì)象關(guān)系映射

hibernate中的對(duì)象關(guān)系映射

2020-12-30 11:38動(dòng)力節(jié)點(diǎn) Java教程

hibernate中的ORM映射文件通常以.hbm.xml作為后綴。使用這個(gè)映射文件不僅易讀,而且可以手工修改,也可以通過一些工具來生成映射文檔,下文給大家詳細(xì)的介紹hibernate中的對(duì)象關(guān)系映射,需要的朋友參考下吧

hibernate的本質(zhì)就是對(duì)象關(guān)系映射(objectrelational mapping),orm實(shí)現(xiàn)了將對(duì)象數(shù)據(jù)保存到數(shù)據(jù)庫中,以前我們對(duì)關(guān)系表進(jìn)行操作,執(zhí)行增刪改查等任務(wù),現(xiàn)在我們不再對(duì)關(guān)系表進(jìn)行操作,而是直接對(duì)對(duì)象操作。hibernate中的orm映射文件通常以.hbm.xml作為后綴。使用這個(gè)映射文件不僅易讀,而且可以手工修改,也可以通過一些工具來生成映射文檔。下面將對(duì)hibernate中的映射進(jìn)行介紹。

hibernate映射分類,如下圖所示。

hibernate中的對(duì)象關(guān)系映射

1 基本類映射

根據(jù)實(shí)體類創(chuàng)建相應(yīng)的表,這種簡單的關(guān)系為hibernate基本映射。

user1實(shí)體類代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//user實(shí)體。
public classuser1 {
 //用戶編號(hào)。
 private string id;
 //名字。
 private string name;
 //密碼。
 private string password;
 //創(chuàng)建日期。
 private date createtime;
 //失效時(shí)間。
 private date expiretime;
 public string getid() {
 return id;
 }
// publicvoid setid(string id) {
// this.id= id;
// }
 public string getname() {
 return name;
 }
 public void setname(string name) {
 this.name = name;
 }
 public string getpassword() {
 return password;
 }
 public void setpassword(stringpassword) {
 this.password = password;
 }
 public date getcreatetime() {
 return createtime;
 }
 public void setcreatetime(datecreatetime) {
 this.createtime = createtime;
 }
 public date getexpiretime() {
 return expiretime;
 }
 public void setexpiretime(dateexpiretime) {
 this.expiretime = expiretime;
 }
 }

user1.hbm.xml映射文件如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
<hibernate-mapping package="com.bjpowernode.hibernate">
 <class name="user1" table="t_user1">
 <id name="id"column="user_id" length="32"access="field">
  <generator class="uuid" />
 </id>
 <!-- 設(shè)置主鍵不能重復(fù)和不能為空的屬性. -->
 <property name="name" length="30"unique="true" not-null="true"/>
 <property name="password"/>
 <property name="createtime" type="date" column="create_time"/>
 <property name="expiretime"/>
 </class>
</hibernate-mapping>

通過user1.hbm.xml映射文件將user1對(duì)象轉(zhuǎn)換為關(guān)系數(shù)據(jù)庫中的表t_user1。
轉(zhuǎn)換出的結(jié)果如下所示:

hibernate中的對(duì)象關(guān)系映射

2 對(duì)象關(guān)系映射

2.1 多對(duì)一關(guān)聯(lián)映射(單向)

例如用戶和組的關(guān)系就是多對(duì)一的關(guān)系,多個(gè)用戶對(duì)應(yīng)一個(gè)組。

hibernate中的對(duì)象關(guān)系映射

將實(shí)體映射成表,將對(duì)應(yīng)的實(shí)體映射成表。對(duì)應(yīng)的屬性映射成表字段。

多對(duì)一關(guān)聯(lián)映射是在多的一端來維護(hù)關(guān)聯(lián)字段,在我們這個(gè)例子中也就是在用戶一端來維護(hù)關(guān)系字段。

user.hbm.xml文件。

?
1
2
3
4
5
6
7
8
9
<hibernate-mapping package="org.hibernate.auction">
 <class name="com.bjpowernode.hibernate.user" table="t_user" >
 <id name="id">
  <generator class="native" />
 </id>
 <property name="name"/>
 <many-to-one name="group" column="groupid"cascade="save-update"></many-to-one>
 </class>
</hibernate-mapping>

group.hbm.xml文件。

?
1
2
3
4
5
6
7
8
<hibernate-mapping package="org.hibernate.auction">
 <class name="com.bjpowernode.hibernate.group" table="t_group">
 <id name="id">
  <generator class="native" />
 </id>
 <property name="name"/>
 </class>
</hibernate-mapping>

在這里我們看的代碼就看*.hbm.mlx代碼,因?yàn)閷?duì)于類之間的關(guān)聯(lián),在實(shí)現(xiàn)時(shí),一個(gè)類作為另一個(gè)類的私有成員,這一點(diǎn)在學(xué)uml建模的時(shí)候我們都懂了,在這里主要看的是orm的m,也就是*.hbm.xml文件。

2.2 一對(duì)一關(guān)聯(lián)映射

一對(duì)一關(guān)聯(lián)映射在實(shí)際生活中是比較常見的,如人與家庭住址的關(guān)系,通過人這個(gè)對(duì)象可以找到他家庭住址相關(guān)的內(nèi)容。

    2.2.1 一對(duì)一映射(單向主鍵關(guān)聯(lián))

hibernate中的對(duì)象關(guān)系映射

單向一對(duì)一主鍵關(guān)聯(lián),靠的是它們的主鍵相等,從person中能看到idcard,也就是把t_idcard中的主鍵拿過來當(dāng)做t_pseron的主鍵。

xml文件中:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<class name="com.bjpowernode.hibernate.person"table="t_person" >
 <id name="id">
 <!-- 采用foreign生成策略,foreign會(huì)取得關(guān)聯(lián)對(duì)象的標(biāo)識(shí) -->
  <generator class="foreign" >
  <!--property指的是關(guān)聯(lián)對(duì)象。 -->
  <param name="property">idcard</param>
  </generator>
 </id>
 <property name="name"/>
 <!-- 一對(duì)一關(guān)聯(lián)映射,主鍵關(guān)聯(lián). -->
 <!--
 one-to-one標(biāo)簽指示hibernate如何加載其關(guān)聯(lián)對(duì)象,默認(rèn)根據(jù)主鍵加載.
 也就是拿到關(guān)系字段值,根據(jù)對(duì)端的主鍵來加載關(guān)聯(lián)對(duì)象.
 constrained="true",表示當(dāng)前主鍵(person的主鍵)還是一個(gè)外鍵 .
 參照了對(duì)端的主鍵(idcard的主鍵),也就是會(huì)生成外鍵約束語句.
 -->
 <one-to-one name="idcard" constrained="true"/>
 </class>
<hibernate-mapping package="org.hibernate.auction">
 
 <class name="com.bjpowernode.hibernate.idcard" table="t_idcard" >
 <id name="id">
  <generator class="native" />
 </id>
 <property name="cardno"/>
 </class>
</hibernate-mapping>

一對(duì)一的關(guān)系是通過one-to-one元素定義的。

 2.2.2 一對(duì)一映射(雙向主鍵關(guān)聯(lián))

一對(duì)一雙向主鍵關(guān)聯(lián)與一對(duì)一單向主鍵關(guān)聯(lián)的區(qū)別就是,一對(duì)一單向主鍵關(guān)聯(lián),在person端能看到idcard,而idcard不能看到person端。而雙向關(guān)聯(lián)就是在idcard端也能看到person,也就是不但在person.hbm.xml中加上<one-to-one>標(biāo)簽,同時(shí)在idcard.hbm.xml文件中加上<one-to-one>標(biāo)簽。代碼如下所示。

?
1
2
3
4
5
6
7
8
9
<hibernate-mapping package="org.hibernate.auction">
 <class name="com.bjpowernode.hibernate.idcard" table="t_idcard" >
 <id name="id">
  <generator class="native" />
 </id>
 <property name="cardno"/>
 <one-to-one name="person"/>
 </class>
</hibernate-mapping>

hibernate中的對(duì)象關(guān)系映射 

2.2.3 一對(duì)一映射(單向唯一外鍵關(guān)聯(lián))

一對(duì)一單向唯一外鍵關(guān)聯(lián),也就是多對(duì)一關(guān)聯(lián)的特例,把多的一端限制為一,就是一對(duì)一唯一外鍵關(guān)聯(lián)。同多對(duì)一一樣,在一端加入另一端的并采用<many-to-one>標(biāo)簽,通過unique="true",這樣來限制了多的一端為一。
先上代碼。

idcard.hbm.xml

?
1
2
3
4
5
6
7
8
9
<hibernate-mapping package="org.hibernate.auction">
 
 <class name="com.bjpowernode.hibernate.idcard" table="t_idcard" >
 <id name="id">
  <generator class="native" />
 </id>
 <property name="cardno"/>
 </class>
</hibernate-mapping>

person.hbm.xml

?
1
2
3
4
5
6
7
8
9
10
<hibernate-mapping package="org.hibernate.auction">
 <class name="com.bjpowernode.hibernate.person" table="t_person" >
 <id name="id">
 <!-- 采用foreign生成策略,foreign會(huì)取得關(guān)聯(lián)對(duì)象的標(biāo)識(shí) -->
  <generator class="native" />
 </id>
 <property name="name"/>
 <many-to-one name="idcard" unique="true"></many-to-one>
 </class>
</hibernate-mapping>

圖如下所示:

hibernate中的對(duì)象關(guān)系映射

在t_pserson端加上一個(gè)外鍵字段idcard,限制idcard的唯一性就是一對(duì)一唯一外鍵關(guān)聯(lián)。

2.2.4 一對(duì)一映射(雙向唯一外鍵關(guān)聯(lián))

一對(duì)一唯一外鍵單向關(guān)聯(lián)我們已經(jīng)了解了,雙向反過來就是在沒有的一端加上就可以了。

我們的idcard.hbm.xml中采用<one-to-one>標(biāo)簽。

?
1
2
3
4
5
6
7
8
9
<hibernate-mapping package="org.hibernate.auction">
 <class name="com.bjpowernode.hibernate.idcard" table="t_idcard" >
 <id name="id">
  <generator class="native" />
 </id>
 <property name="cardno"/>
 <one-to-one name="person" property-ref="idcard"></one-to-one>
 </class>
.</hibernate-mapping>

而person.hbm.xml同一對(duì)一唯一外鍵單向關(guān)聯(lián)一樣。

?
1
2
3
4
5
6
7
8
<class name="com.bjpowernode.hibernate.person" table="t_person" >
 <id name="id">
 <!-- 采用foreign生成策略,foreign會(huì)取得關(guān)聯(lián)對(duì)象的標(biāo)識(shí) -->
 <generator class="native" />
 </id>
 <property name="name"/>
 <many-to-one name="idcard" unique="true"></many-to-one>
 </class>

hibernate中的對(duì)象關(guān)系映射 

從上述中可以總結(jié)出,對(duì)于一對(duì)一關(guān)聯(lián)映射,主鍵關(guān)聯(lián)和唯一外鍵關(guān)聯(lián)單向和雙向產(chǎn)生出的表結(jié)構(gòu)是一樣的,不同的是在加載的時(shí)候不同。也就是一對(duì)一雙向關(guān)聯(lián)和一對(duì)一單向關(guān)聯(lián)的相比,只是改變了一對(duì)一關(guān)聯(lián)映射的加載,而沒有改變存儲(chǔ)。

    2.3 一對(duì)多關(guān)聯(lián)映射

2.3.1 一對(duì)多關(guān)聯(lián)映射(單向)

上面我們介紹了多對(duì)一,我們反過來看一對(duì)多不就是多對(duì)一嗎?那還用再進(jìn)行不同的映射嗎?有什么差別嗎?一對(duì)多和多對(duì)一映射原理是一致的,存儲(chǔ)是相同的,也就是生成的數(shù)據(jù)庫的表是一樣的,他們之間不同的是維護(hù)的關(guān)系不同。

他們之間不同點(diǎn)是維護(hù)的關(guān)系不同

*多對(duì)一維護(hù)的關(guān)系是:多指向一的關(guān)系,有了此關(guān)系,加載多的時(shí)候可以將一加載上來。

*一對(duì)多維護(hù)的關(guān)系是:一指向多的關(guān)系,有了此關(guān)系,在加載一的時(shí)候可以將多加載上來。

hibernate中的對(duì)象關(guān)系映射

代碼如下所示。

class.hbm.xml

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<class name="com.bjpowernode.hibernate.classes" table="t_classes" >
 <id name="id">
  <generator class="native" />
 </id>
 <property name="name"/>
 <set name="students">
 <!--
  <keycolumn="classesid" not-null="true"/>
 -->
  <key column="classesid" />
  <one-to-many class="com.bjpowernode.hibernate.student"/>
 </set>
 </class>

students.hbm.xml

?
1
2
3
4
5
6
<class name="com.bjpowernode.hibernate.student" table="t_student" >
 <id name="id">
 <generator class="native" />
 </id>
 <property name="name"/>
 </class>

從班級(jí)能看到學(xué)生,是班級(jí)來維護(hù)關(guān)系,不是學(xué)生來維護(hù)關(guān)系,學(xué)生不知道自己是哪個(gè)班,所以在存儲(chǔ)學(xué)生的時(shí)候,班級(jí)的代碼不知道。為了更新學(xué)生是哪個(gè)班級(jí)的要發(fā)出很多update語句來告訴學(xué)生是哪個(gè)班級(jí)的。當(dāng)我們?cè)O(shè)置classesid not-null=“true”時(shí),則將無法保存數(shù)據(jù),解決辦法我們改為雙向關(guān)聯(lián)映射。

    2.3.2 一對(duì)多關(guān)聯(lián)映射(雙向)

為了解決一對(duì)多單向可能存在的問題,我們采用雙向一對(duì)多,每一方都能維護(hù)對(duì)方。

hibernate中的對(duì)象關(guān)系映射 

一對(duì)多雙向關(guān)聯(lián)映射方式:

     *在一的一端的集合上采用<key>標(biāo)簽,在多的一端加入一個(gè)外鍵。

     *在多的一端采用<many-to-one>的標(biāo)簽

!~注意<key>標(biāo)簽和<many-to-one>標(biāo)簽加入字段保持一致,否則會(huì)產(chǎn)生數(shù)據(jù)混亂。

代碼如下所示。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<class name="com.bjpowernode.hibernate.classes" table="t_classes" >
 <id name="id">
  <generator class="native" />
 </id>
 <property name="name"/>
 <set name="students" inverse="true">
 <!--
  <keycolumn="classesid" not-null="true"/>
 -->
  <key column="classesid" />
  <one-to-many class="com.bjpowernode.hibernate.student"/>
 </set>
 </class>
<class name="com.bjpowernode.hibernate.student" table="t_student" >
 <id name="id">
  <generator class="native" />
 </id>
 <property name="name"/>
 <many-to-one name="classes"column="classesid"/>
 </class>

注意:inverse屬性

1、 inverse中文意思為相反的,反轉(zhuǎn)。在hibernate中inverse可以用在一對(duì)多和多對(duì)多雙向關(guān)聯(lián)上,inverse默認(rèn)是false,為false的時(shí)候表示本端可以維護(hù)關(guān)系,如果inverse為true,則本端不能維護(hù)關(guān)系,會(huì)交給另一端維護(hù)關(guān)系,本端失效,所以在一對(duì)多關(guān)聯(lián)映射我們通常在多的一端維護(hù)關(guān)系,讓一的一端失效。

2、 inverse是控制方向上的反轉(zhuǎn),只影響存儲(chǔ)。

比較一對(duì)多單向和雙向映射,從存儲(chǔ)結(jié)構(gòu)上看沒有什么區(qū)別,但是從配置文件上看,一對(duì)多雙向比一對(duì)多單向,一對(duì)多雙向關(guān)聯(lián)的配置文件中在多的一端的配置文件上存在<many-to-one>相關(guān)配置,即保證多對(duì)一的映射。 

    2.4 多對(duì)多關(guān)聯(lián)映射

    2.4.1 多對(duì)多關(guān)聯(lián)映射(單向)

多對(duì)多對(duì)象關(guān)系映射,需要加入一張新表完成基本映射。如下圖所示。

hibernate中的對(duì)象關(guān)系映射 

代碼。

role.hbm.xml

?
1
2
3
4
5
6
<class name="com.bjpowernode.hibernate.role" table="t_role">
 <id name="id">
  <generator class="native" />
 </id>
 <property name="name"/>
 </class>

user.hbm.xml

?
1
2
3
4
5
6
7
8
9
10
11
<class name="com.bjpowernode.hibernate.user" table="t_user" >
 <id name="id">
  <generator class="native" />
 </id>
 <property name="name"/>
  
 <set name="roles" table="t_user_role">
  <key column="user_id"/>
  <many-to-many class="com.bjpowernode.hibernate.role" column="role_id"/>
 </set>
 </class>

  2.4.2 多對(duì)多關(guān)聯(lián)映射(雙向)

雙向多對(duì)多對(duì)象關(guān)系映射,是兩端都能將對(duì)方加載上來,雙向都需要加上標(biāo)簽映射。
要注意:

*生成中間表名必須一樣

*生成中間表字段必須一樣

hibernate中的對(duì)象關(guān)系映射 

代碼如下所示。

role.hbm.xml

?
1
2
3
4
5
6
7
8
9
10
<class name="com.bjpowernode.hibernate.role" table="t_role">
 <id name="id">
 <generator class="native" />
 </id>
 <property name="name"/>
 <set name="users" table="t_user_role">
 <key column="role_id"/>
 <many-to-many class="com.bjpowernode.hibernate.user" column="user_id"/>
 </set>
 </class>

  .user.hbm.xml

?
1
2
3
4
5
6
7
8
9
10
11
<class name="com.bjpowernode.hibernate.user"table="t_user" >
 <id name="id">
  <generator class="native" />
 </id>
 <property name="name"/>
  
 <set name="roles" table="t_user_role">
  <key column="user_id"/>
  <many-to-many class="com.bjpowernode.hibernate.role" column="role_id"/>
 </set>
 </class>

區(qū)別:單向多對(duì)多和雙向多對(duì)多存儲(chǔ)結(jié)構(gòu)沒有任何的區(qū)別,但他們的映射文件是有區(qū)別的,加載過程是不同的。  

      3  關(guān)系映射總結(jié)

綜上所述,可以看出,同一類映射,無論是單向還是雙向,他們的存儲(chǔ)結(jié)構(gòu)是相同的,之所以映射文件不同,是因?yàn)榧虞d時(shí)不同(在增刪改時(shí))。

無論是多對(duì)一、一對(duì)多、一對(duì)一還是多對(duì)一,a對(duì)b,a就是主動(dòng)方,a主動(dòng)想要了解b的情況,這樣把b設(shè)置到a端。而雙向,也就是a對(duì)b,a想了解b的信息,而b也想了解a的信息,那就要同時(shí)把a(bǔ)設(shè)置到b端了

以上所述是小編給大家介紹的hibernate中的對(duì)象關(guān)系映射,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)服務(wù)器之家網(wǎng)站的支持!

原文鏈接:http://blog.sina.com.cn/s/blog_9c6852670102wvig.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品久久久久香蕉网 | 国产视频网 | 国产精品无码永久免费888 | 黄色毛片网站在线观看 | 亚洲精品久久久蜜桃 | 黄色a视频| 亚洲精品免费播放 | 欧美一区二区三区在线观看视频 | 欧美精品成人 | 四虎影视在线观看 | 亚洲综合色视频在线观看 | 国产成人综合av | 男女全黄一级一级高潮免费看 | 亚洲一区视频在线 | 亚洲精选久久 | 日韩在线视频观看 | 日韩精品小视频 | 久久婷婷色 | 日韩午夜在线视频 | 玖玖精品| 久久免费精品 | 日本在线观看一区 | h片在线 | 国产精品久久久久久吹潮 | 韩日中文字幕 | 久久国产精品久久国产精品 | 亚洲精品久久久久久久久久久久久 | 日韩欧美一区二区三区免费观看 | av亚洲在线 | 亚洲精品视频在线 | 亚洲免费久久久 | 亚洲精品久久久久久久久久久久久 | 天天操一操 | 久草成人网 | 中文在线视频 | 日韩精品视频在线播放 | 色视频www在线播放国产人成 | 欧美日韩三级在线 | 中文字幕亚洲区 | 欧美精品1区2区 | 中文字幕亚洲一区二区三区 |