Hibernate(10)_一对一的关联映射

本系列博客汇总在这里:Hibernate 汇总


源码工程文件为:hibernate4.3_05 & hibernate4.3_06

一对一的关联映射

类图:
在这里插入图片描述
表的关系:
在这里插入图片描述

1、创建 model 类

必须要给 IdCard 这段一个主键,还有指定一对一的关系。

package com.wyx.hiber.model;

public class IDCard
{

	/**
	 * 提供身份证的主键
	 */
	private Integer cardId;

	private String cardNo;

	/**
	 * 在身份证的类中有一个员工的属性,体现一对一
	 */
	private Emp emp;

	public Integer getCardId()
	{
		return cardId;
	}

	public void setCardId(Integer cardId)
	{
		this.cardId = cardId;
	}

	public String getCardNo()
	{
		return cardNo;
	}

	public void setCardNo(String cardNo)
	{
		this.cardNo = cardNo;
	}

	public Emp getEmp()
	{
		return emp;
	}

	public void setEmp(Emp emp)
	{
		this.emp = emp;
	}

	@Override
	public String toString()
	{
		return "IDCard [cardId=" + cardId + ", cardNo=" + cardNo + "]";
	}

}

2、配置映射文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.wyx.hiber.model">
	<class name="IDCard" table="t_id_card">
		<!-- 指定主键名称,建议使用emp端的主键名称 -->
		<id name="cardId" column="emp_no">
			<!-- 使用外键的方式来生成主键 -->
			<generator class="foreign">
				<!-- 指定idCard这一端的emp属性 -->
				<param name="property">emp</param>
			</generator>
		</id>
		<property name="cardNo" column="card_no"></property>
		<!-- 
			指定一对一的关系
			name:当前端的的另一个一的一端的属性名称emp
			constrained:建表时带有外键约束
		 -->
		<one-to-one name="emp" constrained="true"></one-to-one>
	</class>	
</hibernate-mapping>

Hibernate 的映射文件创建后要注册到我们的 hibernate.cfg.xml 中,然后导出数据库即可。
在这里插入图片描述
在这里插入图片描述

3、一对一单端测试

保存

public void testAdd()
{
	Session session = HibernateUtils.getSession();
	Transaction tx = session.beginTransaction();
	try
	{
		// 创建员工
		Emp emp = new Emp();
		emp.setEname("魏宇轩");
		emp.setAddress("昆明");
		emp.setGender(1);
		emp.setBirthday(new Date());
		// 创建身份证
		IDCard ic = new IDCard();
		ic.setCardNo("1234567890");
		// 指定一对一的关系
		ic.setEmp(emp);
		// 保存ic的时候自动的保存了emp,因为ic的主键是emp的主键,
		// 如果emp不保存主键就不会返回,所以在ic保存之前必须先保存emp
		session.save(ic);
		tx.commit();
	} catch (Exception e)
	{
		e.printStackTrace();
		tx.rollback();
	} finally
	{
		HibernateUtils.closeResource(session);
	}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查询

public void testQuery()
{
	Session session = HibernateUtils.getSession();
	try
	{
		IDCard card = (IDCard) session.get(IDCard.class, 1);
		System.out.println(card);
		System.out.println(card.getEmp());
	} catch (Exception e)
	{
		e.printStackTrace();
	} finally
	{
		HibernateUtils.closeResource(session);
	}
}

在这里插入图片描述

4、一对一的双向关联映射

修改 emp 的模型,加入 idcard 这一端的属性。
在这里插入图片描述
在 emp.hbm.xml 中的配置

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.wyx.hiber.model">
	<class name="Emp" table="t_emp">
		<id name="empNo" column="emp_no">
			<generator class="native"></generator>
		</id>
		<property name="ename"></property>
		<property name="birthday"></property>
		<property name="gender"></property>
		<property name="address"></property>
		<!-- 
			双向关联映射的一对一,从数据库模型的箭头指向方向来看
			name:指定箭头背向端的model属性
		 -->
		<one-to-one name="card" cascade="save-update"></one-to-one>
	</class>
</hibernate-mapping>

保存

public void testAdd()
{
	Session session = HibernateUtils.getSession();
	Transaction tx = session.beginTransaction();
	try
	{
		// 创建员工
		Emp emp = new Emp();
		emp.setEname("魏宇轩");
		emp.setAddress("昆明");
		emp.setGender(1);
		emp.setBirthday(new Date());
		// 创建身份证
		IDCard ic = new IDCard();
		ic.setCardNo("1234567890");
		// 设置员工和身份证的关系,由于是双向映射需要指定双向的关系
		emp.setCard(ic);
		ic.setEmp(emp);
		// 先保存emp
		session.save(emp);
		// 保存ic
		session.save(ic);
		tx.commit();
	} catch (Exception e)
	{
		e.printStackTrace();
		tx.rollback();
	} finally
	{
		HibernateUtils.closeResource(session);
	}
}

使用级联方式就不用单独保存 ic了
在这里插入图片描述
在这里插入图片描述

查询

public void testQuery()
{
	Session session = HibernateUtils.getSession();
	try
	{
		Emp emp = (Emp) session.get(Emp.class, 1);
		System.out.println(emp);
		System.out.println(emp.getCard());
	} catch (Exception e)
	{
		e.printStackTrace();
	} finally
	{
		HibernateUtils.closeResource(session);
	}
}

从箭头指向的方向查询会使用连接查询
在这里插入图片描述

如有错误,欢迎指正!

发布了449 篇原创文章 · 获赞 210 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_36260974/article/details/104106477