hibernate>一对一关联映射 (onetoone) 小强斋

一对一关联映射 (one-to-one)

两个对象之间是一对一的关系,如Person-IdCard,有两种策略可以实现一对一的关联映射

主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联
唯一外键关联:外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系;

一、一对一主键关联映射-单向(Person---->IdCard)

Person类

publicclass Person {

     private int id;

     private IdCard  idCard;

}

映射文件

<hibernate-mapping>
	<class name="com.wsz.entity.Person" table="t_person">
	        <id name="id">
            <generator class="foreign">
            <param name="property">idCard</param>
            </generator>
        </id>
		<property name="name" />
	    <one-to-one name="idCard" constrained="true"/>
		
	</class>
</hibernate-mapping>

IdCard类

publicclass IdCard{

     private int id;

    private String idnumber;

}

映射文件

<hibernate-mapping>
	<class name="com.wsz.entity.Id_Card" table="t_idcard">
		<id name="id">	
			<generator class="native" />
		</id>
		<property name="idnumber" />
	</class>
</hibernate-mapping>

二、一对一主键关联映射-双向(Person<---->IdCard)

Person类 

publicclass Person {

     private int id;

     private IdCard  idCard;

}

映射文件

<hibernate-mapping>
	<class name="com.wsz.entity.Person" table="t_person">
	        <id name="id">
            <generator class="foreign">
            <param name="property">idCard</param>
            </generator>
        </id>
		<property name="name" />
	    <one-to-one name="idCard" constrained="true"/>
		
	</class>
</hibernate-mapping>

IdCard类

publicclass IdCard{

     private int id;

    private String idnumber;

     private Person person;

}

映射文件

<hibernate-mapping>
	<class name="com.wsz.entity.Id_Card" table="t_idcard">
		<id name="id">	
			<generator class="native" />
		</id>
		<property name="idnumber" />
		   <one-to-one name="person"></one-to-one>
	</class>
</hibernate-mapping>

三、一对一唯一外键关联映射-单向(Person---->IdCard)

 

 注意: 一对一唯一外键关联映射 是 多对一关联映射的特例

 可以采用<many-to-one>标签,指定多的一端的unique=true,这样就限制了多的一端的多重性为一

person.hbm.xml

<class name="com.bjsxt.hibernate.Person" table="t_person">
   <id name="id">
    <generator class="native"/>
   </id>
   <property name="name"/>
   <!--数据库中person中会有一个idCard字段作为外键 参照 IdCard的主键-->
   <many-to-one name="idCard" unique="true"/>
  </class>

IdCard.hbm.xml

<hibernate-mapping>
	<class name="com.bjsxt.hibernate.IdCard" table="t_idcard">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="cardNo"/>
	</class>
</hibernate-mapping>

四、一对一唯一外键关联映射--双向关联  (Person<---->IdCard)

 一对一唯一外键关联双向,需要在另一端(idcard),添加<one-to-one>标签,指示hibernate如何加载其关联对象,
 默认根据idcard主键 --> person主键加载person,外键关联映射中,因为两个实体采用的是person的外键维护的关系,所以不能根据person主键加载person,而要根据idcard主键 --> person的外键加载person,所以采用如下映射方式: <one-to-one name="person" property-ref="idCard"/> 

Person.hbm.xml

<hibernate-mapping>
	<class name="com.bjsxt.hibernate.Person" table="t_person">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<many-to-one name="idCard" unique="true"/>
	</class>
</hibernate-mapping>

IdCard.hbm.xml

<class name="com.bjsxt.hibernate.IdCard" table="t_idcard">
   <id name="id">
    <generator class="native"/>
   </id>
   <property name="cardNo"/>
   <!--one-to-one不会在数据库中加外键字段,只是告诉hibernate如何去加载关联对象
    property-ref="idCard"表示不是根据person主键加载,而是根据person的idCard字段加载
   -->
   <one-to-one name="person" property-ref="idCard"/>
  </class>




 

原文地址:https://www.cnblogs.com/xiaoqiangzhaitai/p/5637513.html