一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

服務器之家 - 編程語言 - Java教程 - Hibernate映射之基本類映射和對象關系映射詳解

Hibernate映射之基本類映射和對象關系映射詳解

2020-09-23 13:36永遠的晴天 Java教程

這篇文章主要介紹了Hibernate映射之基本類映射和對象關系映射詳解,非常具有實用價值,需要的朋友可以參考下

回想一些我們在沒有學習ssh的時候,我們建立數據庫的表時,首先是數據庫建模e-r圖,然后再通過實體模型來建立關系模型,再建立相應的表。實體間存在三種關系,一對一,一對多(或者說多對一),多對多。而如今我們要根據類來映射相應的表,那只能是通過類與類之間的關系加上映射文件來映射數據庫的表。我們學習uml建模,類與類之間存在五種關系,繼承,實現,關聯,依賴,聚合/組合,在hibernate中實體類之間的關系也是如此,對于不同的關系對應的代碼實現我們已經很熟悉了,所以對于實體類是復習的知識。

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

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

Hibernate映射之基本類映射和對象關系映射詳解

1 基本類映射

根據實體類創建相應的表,這種簡單的關系為hibernate基本映射。

user1實體類代碼如下:

?
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//user實體。
public classuser1 {
  //用戶編號。
  private string id;
  
  //名字。
  private string name;
  
  //密碼。
  private string password;
  
  //創建日期。
  private date createtime;
  
  //失效時間。
  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
13
<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>
   <!-- 設置主鍵不能重復和不能為空的屬性. -->
   <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對象轉換為關系數據庫中的表t_user1。

轉換出的結果如下所示:

Hibernate映射之基本類映射和對象關系映射詳解

2 對象關系映射

2.1 多對一關聯映射(單向)

例如用戶和組的關系就是多對一的關系,多個用戶對應一個組。

Hibernate映射之基本類映射和對象關系映射詳解

將實體映射成表,將對應的實體映射成表。對應的屬性映射成表字段。

多對一關聯映射是在多的一端來維護關聯字段,在我們這個例子中也就是在用戶一端來維護關系字段。

user.hbm.xml文件。

?
1
2
3
4
5
6
7
8
9
10
<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
9
<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代碼,因為對于類之間的關聯,在實現時,一個類作為另一個類的私有成員,這一點在學uml建模的時候我們都懂了,在這里主要看的是orm的m,也就是*.hbm.xml文件。

2.2 一對一關聯映射

一對一關聯映射在實際生活中是比較常見的,如人與家庭住址的關系,通過人這個對象可以找到他家庭住址相關的內容。

2.2.1 一對一映射(單向主鍵關聯)

 Hibernate映射之基本類映射和對象關系映射詳解

單向一對一主鍵關聯,靠的是它們的主鍵相等,從person中能看到idcard,也就是把t_idcard中的主鍵拿過來當做t_pseron的主鍵。

xml文件中:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<class name="com.bjpowernode.hibernate.person"table="t_person" >
   <id name="id">
   <!-- 采用foreign生成策略,foreign會取得關聯對象的標識 -->
     <generator class="foreign" >
     <!--property指的是關聯對象。 -->
      <param name="property">idcard</param>
     </generator>
   </id>
   <property name="name"/>
   <!-- 一對一關聯映射,主鍵關聯. -->
   <!--
   one-to-one標簽指示hibernate如何加載其關聯對象,默認根據主鍵加載.
   也就是拿到關系字段值,根據對端的主鍵來加載關聯對象.
   constrained="true",表示當前主鍵(person的主鍵)還是一個外鍵 .
   參照了對端的主鍵(idcard的主鍵),也就是會生成外鍵約束語句.
   -->
   <one-to-one name="idcard" constrained="true"/>
  </class>
?
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>

 一對一的關系是通過one-to-one元素定義的。

2.2.2 一對一映射(雙向主鍵關聯)

一對一雙向主鍵關聯與一對一單向主鍵關聯的區別就是,一對一單向主鍵關聯,在person端能看到idcard,而idcard不能看到person端。而雙向關聯就是在idcard端也能看到person,也就是不但在person.hbm.xml中加上<one-to-one>標簽,同時在idcard.hbm.xml文件中加上<one-to-one>標簽。代碼如下所示。

?
1
2
3
4
5
6
7
8
9
10
<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映射之基本類映射和對象關系映射詳解

2.2.3 一對一映射(單向唯一外鍵關聯)

一對一單向唯一外鍵關聯,也就是多對一關聯的特例,把多的一端限制為一,就是一對一唯一外鍵關聯。同多對一一樣,在一端加入另一端的并采用<many-to-one>標簽,通過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
11
12
13
<hibernate-mapping package="org.hibernate.auction">
  
  <class name="com.bjpowernode.hibernate.person" table="t_person" >
   <id name="id">
   <!-- 采用foreign生成策略,foreign會取得關聯對象的標識 -->
     <generator class="native" />
    
   </id>
   <property name="name"/>
   <many-to-one name="idcard" unique="true"></many-to-one>
  
  </class>
</hibernate-mapping>

圖如下所示:

Hibernate映射之基本類映射和對象關系映射詳解

在t_pserson端加上一個外鍵字段idcard,限制idcard的唯一性就是一對一唯一外鍵關聯。

2.2.4 一對一映射(雙向唯一外鍵關聯)

一對一唯一外鍵單向關聯我們已經了解了,雙向反過來就是在沒有的一端加上就可以了。

我們的idcard.hbm.xml中采用<one-to-one>標簽。

?
1
2
3
4
5
6
7
8
9
10
<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同一對一唯一外鍵單向關聯一樣。

?
1
2
3
4
5
6
7
8
9
10
<class name="com.bjpowernode.hibernate.person" table="t_person" >
  <id name="id">
  <!-- 采用foreign生成策略,foreign會取得關聯對象的標識 -->
    <generator class="native" />
   
  </id>
  <property name="name"/>
  <many-to-one name="idcard" unique="true"></many-to-one>
 
 </class>

Hibernate映射之基本類映射和對象關系映射詳解

從上述中可以總結出,對于一對一關聯映射,主鍵關聯和唯一外鍵關聯單向和雙向產生出的表結構是一樣的,不同的是在加載的時候不同。也就是一對一雙向關聯和一對一單向關聯的相比,只是改變了一對一關聯映射的加載,而沒有改變存儲。

2.3 一對多關聯映射

2.3.1 一對多關聯映射(單向)

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

他們之間不同點是維護的關系不同

  1. 多對一維護的關系是:多指向一的關系,有了此關系,加載多的時候可以將一加載上來。
  2. 一對多維護的關系是:一指向多的關系,有了此關系,在加載一的時候可以將多加載上來。

Hibernate映射之基本類映射和對象關系映射詳解

代碼如下所示。

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>

從班級能看到學生,是班級來維護關系,不是學生來維護關系,學生不知道自己是哪個班,所以在存儲學生的時候,班級的代碼不知道。為了更新學生是哪個班級的要發出很多update語句來告訴學生是哪個班級的。當我們設置classesid not-null=“true”時,則將無法保存數據,解決辦法我們改為雙向關聯映射。

2.3.2 一對多關聯映射(雙向)

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

Hibernate映射之基本類映射和對象關系映射詳解

一對多雙向關聯映射方式:

  1. 在一的一端的集合上采用<key>標簽,在多的一端加入一個外鍵。
  2. 在多的一端采用<many-to-one>的標簽

!~注意<key>標簽和<many-to-one>標簽加入字段保持一致,否則會產生數據混亂。

代碼如下所示。

?
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" inverse="true">
   <!--
     <keycolumn="classesid" not-null="true"/>
   -->
     <key column="classesid" />
     <one-to-many class="com.bjpowernode.hibernate.student"/>
   </set>
  </class>
?
1
2
3
4
5
6
7
<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中文意思為相反的,反轉。在hibernate中inverse可以用在一對多和多對多雙向關聯上,inverse默認是false,為false的時候表示本端可以維護關系,如果inverse為true,則本端不能維護關系,會交給另一端維護關系,本端失效,所以在一對多關聯映射我們通常在多的一端維護關系,讓一的一端失效。

2、inverse是控制方向上的反轉,只影響存儲。

比較一對多單向和雙向映射,從存儲結構上看沒有什么區別,但是從配置文件上看,一對多雙向比一對多單向,一對多雙向關聯的配置文件中在多的一端的配置文件上存在<many-to-one>相關配置,即保證多對一的映射。

2.4 多對多關聯映射

2.4.1 多對多關聯映射(單向)

多對多對象關系映射,需要加入一張新表完成基本映射。如下圖所示。

Hibernate映射之基本類映射和對象關系映射詳解

代碼。

role.hbm.xml

?
1
2
3
4
5
6
7
<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 多對多關聯映射(雙向)

雙向多對多對象關系映射,是兩端都能將對方加載上來,雙向都需要加上標簽映射。
要注意:

  1. 生成中間表名必須一樣
  2. 生成中間表字段必須一樣

Hibernate映射之基本類映射和對象關系映射詳解

代碼如下所示。

role.hbm.xml

?
1
2
3
4
5
6
7
8
9
10
11
<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>

區別:單向多對多和雙向多對多存儲結構沒有任何的區別,但他們的映射文件是有區別的,加載過程是不同的。

 3  關系映射總結

綜上所述,可以看出,同一類映射,無論是單向還是雙向,他們的存儲結構是相同的,之所以映射文件不同,是因為加載時不同(在增刪改時)。

無論是多對一、一對多、一對一還是多對一,a對b,a就是主動方,a主動想要了解b的情況,這樣把b設置到a端。而雙向,也就是a對b,a想了解b的信息,而b也想了解a的信息,那就要同時把a設置到b端了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/lovesummerforever/article/details/20901011

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本男男gayxxxxx免费 | 亚洲精品日韩专区在线观看 | 国产精品一久久香蕉产线看 | 91真人毛片一级在线播放 | 欧美jjvideo| 婚色阿花在线全文免费笔 | 欧美人在线一区二区三区 | freefron性中国 | 9丨精品国产高清自在线看 9久热这里只有精品免费 | 精品久久久久中文字幕日本 | 亚洲国产一区二区三区a毛片 | 欧美三级做爰全过程 | 91短视频在线播放 | 污网站免费观看在线高清 | 黄动漫车车好快的车车a | 冰山美人调教耻辱h | 日本一片免费观看高清完整 | 成 人 亚洲 综合天堂 | 3x免费高清视频 | 国产精品久久99 | 五月婷婷俺也去开心 | 精品欧美一区二区三区久久久 | 亚洲第9页| 亚洲精品一区二区三区在线看 | 色综合亚洲天天综合网站 | 暖暖暖免费观看在线观看 | 精品人人做人人爽久久久 | 精品亚洲综合久久中文字幕 | 午夜福利理论片高清在线 | 手机在线免费观看日本推理片 | 亚洲一卡2卡三卡4卡5卡组 | 国产一区在线看 | 国产香蕉97碰碰久久人人 | 欧美成人tv | 99热这里只有精品在线观看 | 国产亚洲玖玖玖在线观看 | 免费视频一区二区 | 成人免费视频一区二区三区 | 男人把大ji巴放进女人小说 | 波多野结衣之双方调教在线观看 | 国产精品原创永久在线观看 |