【SSH 基礎】淺談Hibernate關係映射(3)

來源:互聯網
上載者:User

標籤:add   gravity   date   als   不同   cti   trace   ssi   code   

繼上篇部落格

 

一對多關聯映射(單向)

 

上面我們介紹了多對一,我們反過來看一對多不就是多對一嗎?那還用再進行不同的映射嗎?有什麼區別嗎?一對多和多對一映射原理是一致的,儲存是同樣的。也就是產生的資料庫的表是一樣的。他們之間不同的是維護的關係不同。

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

*多對一維護的關係是:多指向一的關係。有了此關係,載入多的時候能夠將一載入上來。

*一對多維護的關係是:一指向多的關係。有了此關係,在載入一的時候能夠將多載入上來。

 

一個班級有多個學生,通過班級能夠看到學生資訊。

                    

Classes的映射關係

<hibernate-mapping><class name="com.bjpowernode.hibernate.Classes"><id name="id"><generator class="native"></generator></id><property name="name"></property><set name="students"><key column="classesid"/><one-to-many class="com.bjpowernode.hibernate.Student"/></set></class></hibernate-mapping>

Student的映射關係

<hibernate-mapping><class name="com.bjpowernode.hibernate.Student"><id name="id"><generator class="native"></generator></id><property name="name"></property></class></hibernate-mapping>

再看儲存的代碼:給班級設定學生,而由於學生維護關係。就要在學生端儲存班級id--會帶來什麼問題?

public void testSave2(){Session session=null;try{session=HibernateUtils.getSession();session.beginTransaction();Student student1=new Student();student1.setName("張三");session.save(student1);Student student2=new Student();student2.setName("李四");//儲存學生session.save(student2);Classes classes=new Classes();classes.setName("動力節點");Set students=new HashSet();students.add(student1);students.add(student2);classes.setStudents(students);session.save(classes);session.getTransaction().commit();}catch(Exception e){e.printStackTrace();session.getTransaction().rollback();}finally{HibernateUtils.closeSession(session);}}

在儲存資料時,會存在這麼一個時刻:so?帶來的問題


                                 


1,從班級能看到學生。是班級來維護關係,不是學生來維護關係,學生不知道自己是哪個班。所以在儲存學生的時候,班級id不知道。為了更新學生是哪個班級的要發出非常多update語句來告訴學生是哪個班級的。

2。當我們設定classesidnot-null=“true”時,則將無法儲存資料,解決的方法我們改為雙向關聯映射。

 

一對多關聯映射(雙向)

 

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

而不是需求驅動

               

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

     *在一的一端的集合上採用<key>標籤。在多的一端增加一個外鍵。

     *在多的一端採用<many-to-one>的標籤

!~注意<key>標籤和<many-to-one>標籤增加欄位保持一致,否則會產生資料混亂。

 

Classes對應檔

<hibernate-mapping><class name="com.bjpowernode.hibernate.Classes"><id name="id"><generator class="native"></generator></id><property name="name"></property><set name="students" inverse="true"><key column="classesid"/><one-to-many class="com.bjpowernode.hibernate.Student"/></set></class></hibernate-mapping>

Student對應檔

<hibernate-mapping><class name="com.bjpowernode.hibernate.Student"><id name="id"><generator class="native"></generator></id><property name="name"></property><many-to-one name="classes" column="classesid"></many-to-one></class></hibernate-mapping>

注意:Inverse屬性

1、Inverse中文意思為相反的,反轉。在hibernate中inverse能夠用在一對多和多對多雙向關聯上,inverse預設是false。為false的時候表示本端能夠維護關係,假設inverse為true,則本端不能維護關係。會交給還有一端維護關係。本端失效,所以在一對多關聯映射我們通常在多的一端維護關係。讓一的一端失效。

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

 

比較一對多單向和雙向映射,從儲存結構上看沒有什麼差別,可是從設定檔上看。一對多雙向關聯的設定檔裡在多的一端的設定檔上存在<many-to-one>相關配置,即保證多對一的映射。

 

下篇繼續。



【SSH 基礎】淺談Hibernate關係映射(3)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.