關係映射的理解
上篇博客說過ORM是一種持久化的解決方案,它的思想呢就是將關係數據庫中的表的記錄映射到JAVA對象中。直白的說就是JAVA對象和關係數據庫中的記錄建立起了固定的對應關係,對象即記錄!這樣做的帶來的最直接的表現就是,開發人員可以以面向對象的思想來操作關係型的數據庫。對象對應的是數據表中的記錄,而在關係數據庫中記錄和記錄之間存在着一對一、一對多、多對多等關係。ORM映射也需要保存這些記錄之間的關係,它主要通過面向對象中關聯關係來實現,繼承關係是比較特殊的一種反應記錄之間關係的形式。下面從一對一關係映射開始吧。
一對一關聯映射
主鍵關聯:兩張表共享主鍵,即主鍵同步
Person類public class Person {
private String id;
private String name;
private IdCard idCard;
//省略set、get方法
}
IdCard類public class IdCard {
private String id;
private String securityBureau;
private Person person;
//省略set、get方法
}
Person.hbm.xml配置: <hibernate-mapping>
<class name="com.tgb.Person" table="Persons">
<id name="id" column="id" type="string">
<!--這裏生成策略不要糾結,假設它產生身份證號碼-->
<generator class="uuid"></generator>
</id>
<property name="name" column="name" type="string"></property>
<!--使用<one-to-one>表示一對一關聯-->
<one-to-one name="idCard" class="com.tgb.IdCard" cascade="all"></one-to-one>
</class>
</hibernate-mapping> <span style="font-family: FangSong_GB2312; background-color: rgb(255, 255, 255);"> </span>
IdCard.hbm.xml配置:<hibernate-mapping>
<class name="com.tgb.IdCard" table="idCards" >
<id name="id" column="id" type="String">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<property name="securityBureau" column="securityBureau" type="string"></property>
<!-- 一對一關聯 -->
<one-to-one name="Person" class="com.tgb.User" ></one-to-one>
</class>
</hibernate-mapping>
由於採用了主鍵關聯方式,兩張表的主鍵值須保持同步。這也就是說,我們只需爲一張表設定主鍵生成策略,而另一張表的主鍵與之共享就可以了。但是idCards表中的主鍵id並不是參照persons表id的外鍵。
雖然在Pserson類和IdCard類之間有互相引用關係,但是數據庫端persons和idCards表沒有任何參照關係,只是當我們保存User對象時,若User中的idCard屬性值不爲NULL,此時Hibernate就會以Use.hbm.xml中使用的主鍵生成器生成的主鍵值作爲向users表和idCards表中插入記錄的主鍵值,此時保持了關聯記錄的主鍵值的同步(由輸出的SQL語句可知這是由Hibernate處理的,數據庫並不知情)
唯一外鍵關聯:是一種限制的一對多關聯,即在多的一端設置唯一
因爲唯一外鍵關聯和一對多關聯的特殊關係放到下篇博客來說!總結:映射關係的本質是通過Java中對象間的關係來體現其在數據庫中記錄和記錄之間的關係,這種關係映射涉及到了數據庫中的主鍵和外鍵等的使用來保證一對一的關係。因爲在數據庫中記錄的唯一性和主鍵相關。