6.一对一的关联映射

1.一对一的单向关联映射

类图:

表的关系:

1.创建model类

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

public class IDCard {

	private Integer cardId;  //提供身份证的主键
	
	private String cardNo;   
	
	private Emp emp;   //在身份证的类中有一个员工的属性  体现一对一
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE hibernate-mapping PUBLIC  
          "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<hibernate-mapping package="com.zy.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>

然后导出数据库。

3.一对一单端测试

   1.保存

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

    2.查询

主要重写toString。

2.一对一的双向关联映射

修改emp的模型,加入idcard这一端的属性

在Emp.hbm.xml中配置one-to-one

<hibernate-mapping package="com.zy.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"></one-to-one>
	</class>
</hibernate-mapping>

保存:

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

如果只保存emp,就需要使用级联的方式

<one-to-one name="card" cascade="save-update"></one-to-one>
	@Test
	public void testAdd(){
		Session session = HibernateUtils.getSession();
		Transaction tx = session.beginTransaction();
		
		try {
			//创建员工
			Emp emp = new Emp();
			emp.setAddress("aaa");
			emp.setBirthday(new Date());
			emp.setEname("zhang");
			emp.setGender(1);
			
			//创建身份证
			IDCard ic = new IDCard();
			ic.setCardNo("0000000");
			
			//设置员工和身份证的关系,由于是双向映射需要指定双向的关系
			emp.setCard(ic);
			ic.setEmp(emp);
			//只保存emp 使用级联的方式
			session.save(emp);
			
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();
		}finally{
			HibernateUtils.closeResource(session);
		}
	}
	

查询

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

从箭头指向的方向查询会使用连接查询

Hibernate: select emp0_.emp_no as emp_no1_0_0_, emp0_.ename as ename2_0_0_, 
emp0_.birthday as birthday3_0_0_, emp0_.gender as gender4_0_0_, 
emp0_.address as address5_0_0_, idcard1_.emp_no as emp_no1_1_1_, 
idcard1_.card_no as card_no2_1_1_ from t_emp emp0_ left outer join t_id_card idcard1_ on emp0_.emp_no=idcard1_.emp_no where emp0_.emp_no=?
Emp [empNo=2, ename=zhang, birthday=2019-01-19 12:14:52.0, gender=1, address=aaa]
IDCard [cardId=2, cardNo=0000000, emp=Emp [empNo=2, ename=zhang, birthday=2019-01-19 12:14:52.0, gender=1, address=aaa]]

猜你喜欢

转载自blog.csdn.net/weixin_44199723/article/details/86550602