hibernate映射关系之一对一单向主键关联

本文详细介绍了单向一对一关联映射的概念及其实现方式,并通过具体示例代码展示了如何使用Hibernate框架实现主键关联策略。
        单向一对一关联映射(one-to-one):

        两个对象之间一对的关系,例如:Person(人)-IdCard(身份证)

        有两种策略可以实现一对一的关联映射:

               *主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联。如下图:

Person.java

package com.bawei.demo.one2one;

/**
 * Person entity. @author MyEclipse Persistence Tools
 */

public class Person {

	private int id;
	
	private String name;
	
	private IdCard idCard;

	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.java
package com.bawei.demo.one2one;

import java.util.HashSet;
import java.util.Set;

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;
	}
}
IdCard.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.bawei.demo.one2one.IdCard" table="t_idCard">
		<id name="id">
			<generator class="native">
			</generator>
		</id>
		<property name="cardNo"/>
	</class>
</hibernate-mapping>

Person.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.bawei.demo.one2one.Person" table="t_person">
		<id name="id">
			<!-- 采用foreign生成策略,foreign会取得关联对象的标识 -->
			<generator class="foreign">
				<!-- property只关联对象 -->
				<param name="property">idCard</param>
			</generator>
		</id>
		<property name="name"/>
		<!-- one-to-one指示hibernate如何加载其关联对象,默认根据主键加载
			也就是拿到关系字段值,根据对端的主键来加载关联对象
		 -->
		<one-to-one name="idCard" constrained="true"/>
	</class>
</hibernate-mapping>

测试类:

	public void testSave1() {
		  Session session = null;
		try {
			session = new BaseHibernateDAO().getSession();
			session.beginTransaction();

			IdCard idCard = new IdCard();
			idCard.setCardNo("1111111111111111111");

			Person person = new Person();
			person.setName("张三");
			// 建立关联
			person.setIdCard(idCard);

			// 没有抛出TransientObjectException
			// 是由一对一关联映射的特性决定的,它必须先保存关联对象IdCard
			// 这样它采用foreign映射策略才能取得关联对象的标识
			// 也就是它默认了cascade属性
			session.save(person);

			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {

		}
	}

	public static void main(String[] args) {

		new Demo().testSave1();

	}














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

le4

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值