欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

hibernate一對多關(guān)聯(lián)映射學(xué)習(xí)小結(jié)

 更新時間:2017年09月11日 10:26:36   作者:動力節(jié)點  
這篇文章主要介紹了hibernate一對多關(guān)聯(lián)映射學(xué)習(xí)小結(jié),需要的朋友可以參考下

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

映射原理 

      一對多關(guān)聯(lián)映射和多對一關(guān)聯(lián)映射的映射原理是一致的,都是在多的一端加入一個外鍵,指向一的一端。關(guān)聯(lián)關(guān)系都是由多端維護,只是在寫映射時發(fā)生了變化。 

多對一和一對多的區(qū)別

  多對一和一對多的區(qū)別在于維護的關(guān)系不同:

(1)多對一:多端維護一端的關(guān)系,在加載多端時,可以將一端加載上來。

(2)一對多:一端維護多端的關(guān)系,在加載一端時,可以將多端加載上來。 

分類

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

對象模型      

    

      從對象模型中,我們可以看出,Group持有User的一個引用。由于是單向關(guān)聯(lián),所以數(shù)據(jù)在加載Group時,會把User加載上來,但是User并不知道Group的存在。

       我們先看一下Group和User的實體,以及映射文件。

Group

package com.bjpowernode.hibernate; 
import java.util.Set; 
public class Group { 
 private int id; 
 private String name; 
 private Set users; 
  
 public int getId() { 
  return id; 
 } 
 public void setId(int id) { 
  this.id = id; 
 } 
 public String getName() { 
  return name; 
 } 
 public void setName(String name) { 
  this.name = name; 
 } 
 public Set getUsers() { 
  return users; 
 } 
 public void setUsers(Set users) { 
  this.users = users; 
 } 
} 

User

package com.bjpowernode.hibernate; 
public class User { 
 private int id; 
 private String name; 
 public int getId() { 
  return id; 
 } 
 public void setId(int id) { 
  this.id = id; 
 } 
 public String getName() { 
  return name; 
 } 
 public void setName(String name) { 
  this.name = name; 
 } 
} 

User.hbm.xml

<?xml version=1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
 <class name="com.bjpowernode.hibernate.User" table="t_user"> 
  <id name="id"> 
   <generator class="native"/> 
  </id> 
  <property name="name"/> 
 </class> 
</hibernate-mapping> 

Group.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
 <class name="com.bjpowernode.hibernate.Group" table="t_group"> 
  <id name="id"> 
   <generator class="native"/> 
  </id> 
  <property name="name"/> 
  <!-- users屬性,表達的是本對象與User的一對多的關(guān)系 --> 
  <set name="users"> 
    <!--當(dāng)前表(Group)的主鍵--> 
   <key column="groupid"/> 
   <one-to-many class="com.bjpowernode.hibernate.User"/> 
  </set> 
 </class> 
</hibernate-mapping> 

生成的表結(jié)構(gòu)和測試數(shù)據(jù)

缺點 

1)因為多端User不知道Group的存在(也就是User不維護與Group的關(guān)系),所以在保存User時,關(guān)系字段groupId為null,如果該字段設(shè)置為非空,則將無法保存數(shù)據(jù)。

2)因為User不維護關(guān)系,而Group維護關(guān)系,Group就會發(fā)出多余的update語句,保證Group和User有關(guān)系,這樣加載Group時才把該Users對應(yīng)的用戶加載上來。 

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

對象模型       

  

        雙向關(guān)聯(lián)映射對比單向關(guān)聯(lián)映射,對象的加載方向由單向變成了雙向。 

我們看一下Group和User的實體,映射文件

Group

package com.bjpowernode.hibernate; 
import java.util.Set; 
public class Group { 
 private int id; 
 private String name; 
 private Set users; 
 
 public int getId() { 
  return id; 
 } 
 public void setId(int id) { 
  this.id = id; 
 } 
 public String getName() { 
  return name; 
 } 
 public void setName(String name) { 
  this.name = name; 
 } 
 public Set getUsers() { 
  return users; 
 } 
 public void setUsers(Set users) { 
  this.users = users; 
 } 
} 

User

package com.bjpowernode.hibernate; 
public class User { 
 private int id; 
 private String name; 
 private Group groups; 
 public int getId() { 
  return id; 
 } 
 public void setId(int id) { 
  this.id = id; 
 } 
 public String getName() { 
  return name; 
 } 
 public void setName(String name) { 
  this.name = name; 
 } 
 public Group getGroups() { 
  return groups; 
 } 
 public void setGroups(Group groups) { 
  this.groups = groups; 
 } 
} 

Group.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping package="com.bjpowernode.hibernate"> 
 <class name="Group" table="t_group"> 
  <id name="id"> 
   <generator class="native"/> 
  </id> 
  <property name="name"/> 
  <!-- 影響控制反轉(zhuǎn):inverse="false",多的一端維護關(guān)系,讓一的一端失效 --> 
  <set name="users" inverse="true"> 
   <key column="groupid" not-null="true"/> 
   <one-to-many class="User"/> 
  </set> 
 </class> 
</hibernate-mapping> 

User.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping package="com.bjpowernode.hibernate"> 
 <class name="User" table="t_user"> 
  <id name="id"> 
   <generator class="native"/> 
  </id> 
  <property name="name"/> 
  <!-- groups屬性,表達的是本對象與Group的多對一的關(guān)系 --> 
  <many-to-one name="groups" class="Group" column="groupid"/> 
 </class> 
</hibernate-mapping> 

生成的表和測試數(shù)據(jù) 

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

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

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

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

inverse屬性:

         inverse屬性可以用在一對多和多對多雙向關(guān)聯(lián)上,inverse屬性默認為false,為false表示本端維護關(guān)系,如果inverse為true,則本端不能維護關(guān)系,會交給另一端維護關(guān)系,本端失效。所以一對多關(guān)聯(lián)映射我們通常在多的一端維護關(guān)系,讓一的一端失效,所以設(shè)置為inverse為true。

注意:inverse屬性,只影響數(shù)據(jù)的存儲,也就是持久化。 

目的 

       一對多雙向關(guān)聯(lián)映射的目的主要是為了解決一對多單向關(guān)聯(lián)的缺陷而不是需求驅(qū)動的。

總結(jié)

以上所述是小編給大家介紹的hibernate一對多關(guān)聯(lián)映射學(xué)習(xí)小結(jié),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Eclipse IDE可支持Java 14編程

    Eclipse IDE可支持Java 14編程

    這篇文章主要介紹了Eclipse IDE可支持Java 14編程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • java正則表達式如何獲取xml文件中指定節(jié)點的值

    java正則表達式如何獲取xml文件中指定節(jié)點的值

    這篇文章主要介紹了java正則表達式如何獲取xml文件中指定節(jié)點的值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • java并發(fā)編程專題(三)----詳解線程的同步

    java并發(fā)編程專題(三)----詳解線程的同步

    這篇文章主要介紹了JAVA并發(fā)編程 線程同步的的相關(guān)資料,文中示例代碼非常詳細,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Kryo框架使用方法代碼示例

    Kryo框架使用方法代碼示例

    這篇文章主要介紹了Kryo框架的相關(guān)內(nèi)容,文中向大家分享了Kryo框架使用方法代碼示例,小編覺得挺不錯的,希望能給大家一個參考。
    2017-10-10
  • Java web項目啟動Tomcat報錯解決方案

    Java web項目啟動Tomcat報錯解決方案

    這篇文章主要介紹了Java web項目啟動Tomcat報錯解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • Java?guava框架LoadingCache及CacheBuilder本地小容量緩存框架總結(jié)

    Java?guava框架LoadingCache及CacheBuilder本地小容量緩存框架總結(jié)

    Guava?Cache本地緩存框架主要是一種將本地數(shù)據(jù)緩存到內(nèi)存中,但數(shù)據(jù)量并不能太大,否則將會占用過多的內(nèi)存,本文給大家介紹Java?guava框架?LoadingCache及CacheBuilder?本地小容量緩存框架總結(jié),感興趣的朋友一起看看吧
    2023-12-12
  • 詳解Java中的do...while循環(huán)語句的使用方法

    詳解Java中的do...while循環(huán)語句的使用方法

    這篇文章主要介紹了Java中的do...while循環(huán)語句的使用方法,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • Java可重入鎖ReentrantLock詳解

    Java可重入鎖ReentrantLock詳解

    這篇文章主要介紹了Java可重入鎖ReentrantLock詳解,ReentrantLock是一個可重入且獨占式的鎖,是一種遞歸無阻塞的同步機制,它支持重復(fù)進入鎖,即該鎖能夠支持一個線程對資源的重復(fù)加鎖,除此之外,該鎖的還支持獲取鎖時的公平和非公平性選擇,需要的朋友可以參考下
    2023-09-09
  • SpringBoot中通過8項配置優(yōu)化提升Tomcat性能的配置方法

    SpringBoot中通過8項配置優(yōu)化提升Tomcat性能的配置方法

    優(yōu)化Spring Boot,Spring Cloud 應(yīng)用程序中Tomcat的配置有助于提高性能和資源利用率,這篇文章主要介紹了SpringBoot中通過8項配置優(yōu)化提升Tomcat性能的配置方法,需要的朋友可以參考下
    2024-08-08
  • Java線程池的幾種實現(xiàn)方法及常見問題解答

    Java線程池的幾種實現(xiàn)方法及常見問題解答

    下面小編就為大家?guī)硪黄狫ava線程池的幾種實現(xiàn)方法及常見問題解答。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05

最新評論