標籤: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)