1. 程式人生 > >【SSH 基礎】淺談Hibernate關系映射(3)

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

區別 ack 增加 ans 存儲結構 mil pro 映射 方向

繼上篇博客

一對多關聯映射(單向)

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

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

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

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

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

技術分享

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)