Hibernate一对一 主键关联映射(one-to-one)

**两个对象之间是一对一的关系,如Person-IdCard(人-身份证号)
**有两种策略可以实现一对一的关联映射

 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应关系;

数据库不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联。

  》唯一外键关联:外键关联本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联映射。

主键关联映射(单向)

实例场景:   人-->身份证号(Person-->IdCard),从IdCard看不到Person对象

主键关联 关系模型如下:


对象模型:


IdCard实体类:

public class IdCard implements <span style="color:#ff0000;">java.io.Serializable</span>{
	<span style="color:#ff0000;">private static final long serialVersionUID = 1L;</span>
	private Integer id;
	private Date validateDte;
	private Person person;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public Date getValidateDte() {
		return validateDte;
	}
	public void setValidateDte(Date validateDte) {
		this.validateDte = validateDte;
	}
	public Person getPerson() {
		return person;
	}
	public void setPerson(Person person) {
		this.person = person;
	}
}
Person实体类:
public class Person <span style="color:#ff0000;">implements java.io.Serializable</span>{
	<span style="color:#ff0000;">private static final long serialVersionUID = 1L;</span>
	private Integer id;
	private String name;
	private IdCard idCard;
	public Integer getId() {
		return id;
	}
	public void setId(Integer 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实体映射文件  IdCard.hbm.xml:

<hibernate-mapping package="com.hl.domain">
	<class name="IdCard">
		<id name="id" type="java.lang.Integer">
			<generator class="foreign">
				<param name="property">person</param>
			</generator>
		</id> 
		<!-- <id name="id" type="java.lang.Integer">
			<generator class="assigned"/>
		</id>-->
		<property name="validateDte" type="java.util.Date">
			<column name="validateDte" length="128"/>
		</property>
		<many-to-one name="person" update="true"/>
	</class>
</hibernate-mapping>
Person实体映射文件 Person.hbm.xml:
<hibernate-mapping>  
    <class name="com.cn.hibernate.Person" table="t_person">  
        <id name="id" column="id">  
            <!--  
                因为主键不是自己生成的,而是作为一个外键(来源于其它值),所以使用foreign生成策略  
                foreign:使用另外一个相关联的对象的标识符,通常和<one-to-one>联合起来使用。  
                再使用元素<param>的属性值指定相关联对象(这里Person相关联的对象为idCard,则标识符为idCard的id)为了能够在加载person数据同时加载IdCard数据,所以需要使用一个标签<one-to-one>来设置这个功能。  
             -->  
            <generator class="foreign">  
                <!-- 元素<param>属性name的值是固定为property -->  
                <param name="property">idCard</param>  
            </generator>  
        </id>  
        <property name="name"/>  
        <!-- <one-to-one>标签  
        表示如何加载它的引用对象(这里引用对象就指idCard这里的name值是idCard),同时也说是一对一的关系。  
        默认方式是根据主键加载(把person中的主键取出再到IdCard中来取相关IdCard数据。)  
 我们也说过此主键也作为一个外键引用 了IdCard,所以需要加一个数据库限制(外键约束)constrained="true"  
         -->  
        <one-to-one name="idCard" constrained="true"/>      
</class>  
</hibernate-mapping>  

配置hibernate.cfg.xml文件

<pre name="code" class="html" style="color: rgb(51, 51, 51);"><session-factory>
	<property name="dialect">数据库</property>
	<property name="connection.url">url地址</property>
<span style="color: rgb(51, 51, 51); white-space: pre;">	</span><span style="color:#333333;"><property name="connection.username">用户名</property>
	<property name="connection.password">密码</property>
	
	</span><span style="color:#ff0000;"><property name="hbm2ddl.auto">update</property></span><span style="color:#333333;">
	<property name="show_sql">true</property>
	</span><span style="color:#ff0000;"><mapping resource="com/hl/domain/Person.hbm.xml"/>
	<mapping resource="com/hl/domain/IdCard.hbm.xml"/></span><span style="color:#333333;">
</session-factory></span></span>
 
测试: 
<pre name="code" class="java">public static void main(String[] args) {
		//添加一组Person/idcard
		Session s=null;
		Transaction tx=null;
		try {
			//我们使用基础模板来讲解.
			s=HibernateUtil.getCurrentSession();
			tx=s.beginTransaction();
		
			Person p1=new Person();
			p1.setId(1234);
			p1.setName("顺平");
			IdCard idCard=new IdCard();
			idCard.setId(1900);
			idCard.setValidateDte(new Date());
			
			idCard.setPerson(p1);//表示idCard对象是属于p1这个对象.
			s.save(p1);//先保存人
			s.save(idCard);
			
			tx.commit();
			
		} catch (Exception e) {
			e.printStackTrace();
			if(tx!=null){
				tx.rollback();
			}
		}finally{
			
			if(s!=null && s.isOpen()){
				s.close();
			}
		}	
	}
}
 


查询数据库,有对应的表和数据,则测试通过!







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值