【SSH 基礎】淺談Hibernate關系映射(3)
繼上篇博客
一對多關聯映射(單向)
上面我們介紹了多對一,我們反過來看一對多不就是多對一嗎?那還用再進行不同的映射嗎?有什麽區別嗎?一對多和多對一映射原理是一致的,存儲是同樣的。也就是生成的數據庫的表是一樣的。他們之間不同的是維護的關系不同。
他們之間不同點是維護的關系不同
*多對一維護的關系是:多指向一的關系。有了此關系,載入多的時候能夠將一載入上來。
*一對多維護的關系是:一指向多的關系。有了此關系,在載入一的時候能夠將多載入上來。
一個班級有多個學生,通過班級能夠看到學生信息。
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>
再看保存的代碼:給班級設置學生,而由於學生維護關系。就要在學生端保存班級
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)