本系列博客汇总在这里: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);
}
}
从箭头指向的方向查询会使用连接查询
如有错误,欢迎指正!