Hibernate的1-1映射關系主要分為兩類:
1.Hibernate基于外鍵映射的1對1關聯關系 對于基于外鍵的1-1關聯,其外鍵可以存放在任意一邊,在需要存放外鍵一端,增加many-to-one元素。為many-to-one元素增加unique="true"屬性表示為1-1關聯
1 <many-to-one name="mgr" class="com.yl.hibernate.one2one.foreign.Manager" column="MGR_ID" unique="true"></many-to-one>
另一端需要使用one-to-one元素,該元素使用PRoperty-ref屬性指定使用被關聯實體主鍵以外的字段作為關聯字段
1 <one-to-one name="dept" class="com.yl.hibernate.one2one.foreign.Department" property-ref="mgr"></one-to-one>
--如果不使用property-ref屬性,SQL如下:
1 from2 MANAGERS manager0_ 3 left outer join4 DEPARTMENTS department1_ 5 on manager0_.MGR_ID=department1_.DEPT_ID
--如果使用property-ref屬性,SQL如下:
1 from2 MANAGERS manager0_ 3 left outer join4 DEPARTMENTS department1_ 5 on manager0_.MGR_ID=department1_.MGR_ID
------------------------------------代碼------------------------------------------------------------------
Department.hbm.xml
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <!-- Generated 2014-11-29 20:05:53 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping> 6 <class name="com.yl.hibernate.one2one.foreign.Department" table="DEPARTMENTS"> 7 <id name="deptId" type="java.lang.Integer"> 8 <column name="DEPT_ID" /> 9 <generator class="native" />10 </id>11 <property name="deptName" type="java.lang.String">12 <column name="DEPT_NAME" />13 </property>14 15 <!-- 使用many-to-one 的方式來映射1-1關聯關系 -->16 <many-to-one name="mgr" class="com.yl.hibernate.one2one.foreign.Manager" column="MGR_ID" unique="true"></many-to-one>17 18 </class>19 </hibernate-mapping>
Manager.hbm.xml
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <!-- Generated 2014-11-29 20:05:53 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping> 6 <class name="com.yl.hibernate.one2one.foreign.Manager" table="MANAGERS"> 7 <id name="mgrId" type="java.lang.Integer"> 8 <column name="MGR_ID" /> 9 <generator class="native" />10 </id>11 <property name="mgrName" type="java.lang.String">12 <column name="MGR_NAME" />13 </property>14 15 <!-- 映射1-1的關聯關系:在對應的數據表中已經有外鍵了,當前持久化類使用one-to-one 進行映射 -->16 <!-- 沒有外鍵的一端需要使用one-to-one元素,該元素使用property-ref 屬性指定使用被關聯實體主鍵以外的字段作為關聯字段 -->17 <one-to-one name="dept" class="com.yl.hibernate.one2one.foreign.Department" property-ref="mgr"></one-to-one>18 19 20 21 </class>22 </hibernate-mapping>
2.Hibernate基于主鍵映射的1對1關聯關系 基于主鍵的映射策略:指一端的主鍵生成器使用foreign策略,表明根據“”對方“的主鍵來生成自己的主鍵,自己并不能獨立生成主鍵。<param>子元素指定使用當前持久化類的哪個屬性作為"對方"
1 <id name="deptId" type="java.lang.Integer">2 <column name="DEPT_ID" />3 <!-- 使用外鍵的方式來生成當前的主鍵 -->4 <generator class="foreign">5 <!-- property屬性指定使用當前持久化類的哪一個屬性的主鍵作為外鍵 -->6 <param name="property">mgr</param>7 </generator>8 </id>
采用foreign主鍵生成器策略的一端增加one-to-one元素映射關聯屬性,其one-to-one屬性還應增加constrained="true"屬性;另一端增加one-to-one元素映射關聯屬性 constrained(約束):指定為當前持久化類對應的數據庫表的主鍵添加一個外鍵約束,引用被關聯的對象("對方")所對應的數據庫表主鍵
------------------------------------代碼------------------------------------------------------------------
Department.hbm.xml
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <!-- Generated 2014-11-29 20:05:53 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping> 6 <class name="com.yl.hibernate.one2one.primary.Department" table="DEPARTMENTS"> 7 <id name="deptId" type="java.lang.Integer"> 8 <column name="DEPT_ID" /> 9 <!-- 使用外鍵的方式來生成當前的主鍵 -->10 <generator class="foreign">11 <!-- property屬性指定使用當前持久化類的哪一個屬性的主鍵作為外鍵 -->12 <param name="property">mgr</param>13 </generator>14 </id>15 <property name="deptName" type="java.lang.String">16 <column name="DEPT_NAME" />17 </property>18 19 <one-to-one name="mgr" class="com.yl.hibernate.one2one.primary.Manager" constrained="true"></one-to-one>20 </class>21 </hibernate-mapping>
Manager.hbm.xml
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <!-- Generated 2014-11-29 20:05:53 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping package="com.yl.hibernate.one2one.primary"> 6 <class name="Manager" table="MANAGERS"> 7 <id name="mgrId" type="java.lang.Integer"> 8 <column name="MGR_ID" /> 9 <generator class="native" />10 </id>11 <property name="mgrName" type="java.lang.String">12 <column name="MGR_NAME" />13 </property>14 15 <!-- 16 采用foreign主鍵生成器策略的一端增加one-to-one元素映射關聯屬性,17 其one-to-one節點還應增加constrained="true"屬性;以使當前的主鍵上添加外鍵約束18 -->19 <one-to-one name="dept" class="Department" property-ref="mgr"></one-to-one>20 21 22 23 </class>24 </hibernate-mapping>
新聞熱點
疑難解答