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这一端的属性
扫描二维码关注公众号,回复:
4983605 查看本文章
在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]]