Hibernate一對(duì)一 主鍵關(guān)聯(lián)映射
*兩個(gè)對(duì)象之間是一對(duì)一的關(guān)系,如Person-IdCard(人-身份證號(hào))
*有兩種策略可以實(shí)現(xiàn)一對(duì)一的關(guān)聯(lián)映射
》主鍵關(guān)聯(lián):即讓兩個(gè)對(duì)象具有相同的主鍵值,以表明它們之間的一一對(duì)應(yīng)關(guān)系;數(shù)據(jù)庫不會(huì)有額外的字段來維護(hù)它們之間的關(guān)系,僅通過表的主鍵來關(guān)聯(lián)
》唯一外鍵關(guān)聯(lián):外鍵關(guān)聯(lián)本來是用于多對(duì)一的配置,但是如果加上唯一的限制之后,也可以用來表示一對(duì)一關(guān)聯(lián)映射
1.主鍵關(guān)聯(lián)映射(單向)
實(shí)例場景:人-->身份證號(hào)(Person-->IdCard),從IdCard看不到Person對(duì)象
對(duì)象模型:
IdCard實(shí)體類:
- public class IdCard {
- private int id;
- private String cardNo;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getCardNo() {
- return cardNo;
- }
- public void setCardNo(String cardNo) {
- this.cardNo = cardNo;
- }
- }
Person實(shí)體類:
- public class Person {
- private int id;
- private String name;
- private IdCard idCard;//持有IdCard對(duì)象的引用
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public IdCard getIdCard() {
- return idCard;
- }
- public void setIdCard(IdCard idCard) {
- this.idCard = idCard;
- }
- }
IdCard實(shí)體映射文件:
- <hibernate-mapping>
- <class name="com.cn.hibernate.IdCard" table="t_idcard">
- <id name="id" column="id">
- <generator class="native"/>
- </id>
- <property name="cardNo"/>
- </class>
- </hibernate-mapping>
Person實(shí)體映射文件:
- <hibernate-mapping>
- <class name="com.cn.hibernate.Person" table="t_person">
- <id name="id" column="id">
- <!--
- 因?yàn)橹麈I不是自己生成的,而是作為一個(gè)外鍵(來源于其它值),所以使用foreign生成策略
- foreign:使用另外一個(gè)相關(guān)聯(lián)的對(duì)象的標(biāo)識(shí)符,通常和<one-to-one>聯(lián)合起來使用。
- 再使用元素<param>的屬性值指定相關(guān)聯(lián)對(duì)象(這里Person相關(guān)聯(lián)的對(duì)象為idCard,則標(biāo)識(shí)符為idCard的id)為了能夠在加載person數(shù)據(jù)同時(shí)加載IdCard數(shù)據(jù),所以需要使用一個(gè)標(biāo)簽<one-to-one>來設(shè)置這個(gè)功能。
- -->
- <generator class="foreign">
- <!-- 元素<param>屬性name的值是固定為property -->
- <param name="property">idCard</param>
- </generator>
- </id>
- <property name="name"/>
- <!-- <one-to-one>標(biāo)簽
- 表示如何加載它的引用對(duì)象(這里引用對(duì)象就指idCard這里的name值是idCard),同時(shí)也說是一對(duì)一的關(guān)系。
- 默認(rèn)方式是根據(jù)主鍵加載(把person中的主鍵取出再到IdCard中來取相關(guān)IdCard數(shù)據(jù)。)
- 我們也說過此主鍵也作為一個(gè)外鍵引用 了IdCard,所以需要加一個(gè)數(shù)據(jù)庫限制(外鍵約束)constrained="true"
- -->
- <one-to-one name="idCard" constrained="true"/>
- </class>
- </hibernate-mapping>
原文鏈接:http://blog.csdn.net/fengxuezhiye/article/details/7374584
【編輯推薦】