標簽:blog class code com size img java div http javascript 404
关联映射就是将关联关系映射到數據庫里,在对象模型中就是一个或多个引用。
一、Hibernate多對一關聯映射:就是在“多”的一端加外鍵,指向“一”的一端。
比如多個學生對應一個班級,多個用戶對應一個級別等等,都是多對一關系。
1、“多”端實體加入引用“一”端實體的變量及getter,setter方法。
比如说多个学生对应一个班级,在学生实体类加入:private Grade grade;
2、“多”端配置文件,student.hbm.xml里的标签设置:<many-to-one name="grade" column="gradeId" ></many-to-one>
二、Hibernate單向的一對一主鍵關聯映射:就是讓兩個實體的主鍵一樣,就不需要加入多余的字段了。
比如一個學生對應一個身份證號,一個學生對應一條戶口信息等等,都是一對一關聯映射。
1、Person实体里要持有IdCard的引用。在Person实体里加入属性:Private IdCard idCard;
2、Person端维护关系,所以需要重点看Person的配置文件,Person.hbm.xml通俗来讲 ,就是就是Person中的Id既为主键又为外键。
所以需要修改Person中的id標簽:通俗来讲是告诉Person里的id去关联哪个实体里的id。
此處的foreign生成策略,會取得關聯對象的標識。
此處的property標簽內是關聯對象。
<id name="id">
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
3、在Person.hbm.xml中添加关联关系的標簽:<one-to-one name="idCard" constrained="true"><one-to-one/>
這裏的one-to-one標簽指示hibernate如何加載其關聯對象,默認根據主鍵加載也就是拿到關系字段值,根據對端的主鍵來加載關聯對象。
這裏的constrained="true"表示當前主鍵Person的id主鍵,還是一個外鍵,參照了對應端的主鍵IdCard的id主鍵,會生成外鍵約束語句。
注:采用foreign映射策略在保存person對象的同時也會保存關聯的對象,也就是idCard,他們之間還有級聯關系。但是反之就不可以,也就是說,如果只保存IdCard對象,是會出錯的,不會保存Person對象,因爲關系的維護端在Person端,IdCard根本就不知道Person的存在。主鍵關聯映射有弊端,不好維護。
三、Hibernate雙向一對一關聯映射:有些需求要求從一端可以查到另一端,從另一端又可以查到這一端,就需要雙向的關聯映射。
比如說,想要根據人的信息查到他的戶口信息,也想根據戶口信息查到這是哪個人的信息等。
1、修改对象模型,在IdCard.java 的实体里加入Person的引用,添加属性:private Person person;(在Person.java实体里也有IdCard的引用哦)
2、修改IdCard.hbm.xml文件,添加one-to-one標簽。
<one-to-one name="person"/>
注1:one-to-one标签不影响存储,只影响加载,不会修改數據庫,也就是说不会添加字段,而many-to-one会修改數據庫,会增加一个字段。
注2:了解抓取策略:fetch="select" 可以控制查取数据的顺序。
四、單向一對一唯一外鍵關聯映射:一對一主鍵關聯不好維護,用外鍵關聯對象比較好。原理:多對一的特殊情況。
比如說還是Person和IdCard的例子。
1、Person.java是实体里有IdCard的引用,即加入属性:private IdCard idCard;IdCard.java里没有Person引用。
2、配置文件:IdCard.hbm.xml裏都是普通屬性。Person.hbm.xml的主鍵生成策略需要改變:改回:
<generator class="native"/>
使用标签many-to-one和unique : <many-to-one name="idCard" unique="true"/> ,这样就限制了多的一端的唯一性。
注:這裏需要先保存IdCard.否則報錯。
五、雙向一對一唯一外鍵關聯:如果有需求要求的情況下,也可以建立雙向的外鍵關聯。
1、在Person和IdCard裏添加對應端的引用,即添加相應屬性。
2、person.hbm.xml和例子(四)中一样,修改IdCard.hbm.xml文件,添加one-to-one標簽:<one-to-one name="person" property-ref="idCard"></one-to-one>.
注:必須指定one-to-one標簽中的property-ref屬性爲關系字段的名稱。
六、Hibernate單向一對多關聯映射:讓一的一端維護關系,和多對一的映射原理是一樣的,都是在多的一端加入一個外鍵指向一的一端;
區別在于維護的關系不同:
比如說一個班裏有多名學生。
1、Classes.java 和 Student.java里各有两个普通属性id和name。在Classes里加入新属性:private Set students;
2、映射文件的修改:Classes.hbm.xml裏除了普通屬性,加入集合映射:
<set name="students">
<key column="classesid"></key>
<one-to-many class="com.juyahong.hibernate.Student"/>
</set>
注1:“一”的一端維護關系。
注2:session.save(student),session.save(classes),保存student和classes對象。可以成功保存數據,但是需要發出多余的update語句來維持關系。
下篇博客继续分析。
Hibernate的七種映射關系之七種關聯映射(一),码迷,mamicode.com
標簽:blog class code com size img java div http javascript 404
原文地址:http://www.cnblogs.com/jyh317/p/3691842.html