1.一对多的单向关联
类图:
表关系:
1.创建model对象
多的一端
public class Emp {
private Integer empNo;
private String ename;
private Date birthday;
private Integer gender;
private String address;
一的一端
2.配置映射文件
一对多只在一的一端配置
Team.hbm.xml
<?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="Team" table="t_team">
<id name="tId" column="t_id">
<generator class="native"></generator>
</id>
<property name="tName" column="t_name"></property>
<property name="loc"></property>
<!--
set指定一对多的关系配置
name:在一的一端的模型类中集合的属性名
-->
<set name="set">
<!--
key:在多的一端的表中要产生的外键
column:外键名称
-->
<key column="t_id"></key>
<!--
one-to-many:指定多的一端的类
class:多的一端的类
-->
<one-to-many class="Emp"/>
</set>
</class>
</hibernate-mapping>
注意修改注册表的配置。
Emp.hbm.xml
<?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="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>
</class>
</hibernate-mapping>
3.测试一对多
1.保存
public class TestHibernate {
@Test
public void testAdd(){
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
try {
//创建员工
Emp emp = new Emp();
emp.setEname("乔丹");
emp.setAddress("芝加哥");
emp.setBirthday(new Date());
emp.setGender(1);
//保存员工
session.save(emp);
Emp emp1 = new Emp();
emp1.setEname("菲尔");
emp1.setAddress("芝加哥");
emp1.setBirthday(new Date());
emp1.setGender(1);
session.save(emp1);
//创建球队
Team team = new Team();
team.settName("公牛队");
team.setLoc("芝加哥");
//把两个员工加入到集合中
Set<Emp> set = new HashSet<Emp>();
set.add(emp);
set.add(emp1);
//指定球队和员工一对多的关系
team.setSet(set);
//保存球队
session.save(team);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtils.closeResource(session);
}
}
从输出上可以看出来在保存员工时先插入员工的基本字段,外键t_id是空的,再插入球队
最后根据生成的球队的t_id来修改两个员工的球队外键t_id.缺点是如果员工表中外键为非空插入员工时就会报错。
只保存球队,不保存员工。也可以设置级联的方式
<set name="set" cascade="save-update" >
2.查询
public class TestHibernate {
@Test
public void testQuery(){
Session session = HibernateUtils.getSession();
try {
Team team = (Team) session.get(Team.class, 1);
System.out.println(team);
Set<Emp> set = team.getSet();
for(Emp s : set){
System.out.println(s);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
HibernateUtils.closeResource(session);
}
}
}
2.一对多的双向关联
1.创建模型
2.修改配置
修改多的一端的配置
3.测试一对多双向
保存一对多的,要把操作给多的一端去操作
public class TestHibernate {
@Test
public void testAdd(){
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
try {
//创建球队
Team team = new Team();
team.settName("公牛队");
team.setLoc("芝加哥");
//保存球队
session.save(team);
//创建员工
Emp emp = new Emp();
emp.setEname("乔丹");
emp.setAddress("芝加哥");
emp.setBirthday(new Date());
emp.setGender(1);
//指定员工和球队的关系
emp.setTeam(team);
//保存员工
session.save(emp);
Emp emp1 = new Emp();
emp1.setEname("菲尔");
emp1.setAddress("芝加哥");
emp1.setBirthday(new Date());
emp1.setGender(1);
emp1.setTeam(team);
session.save(emp1);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtils.closeResource(session);
}
}
}
如果有需求必须要在一的一端来进行保存,我们设置控制反转,我们可以在一的一端操作,然后实际是在多的一端保存
public class TestHibernate {
@Test
public void testAdd(){
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
try {
//创建球队
Team team = new Team();
team.settName("公牛队");
team.setLoc("芝加哥");
//创建员工
Emp emp = new Emp();
emp.setEname("乔丹");
emp.setAddress("芝加哥");
emp.setBirthday(new Date());
emp.setGender(1);
//指定员工和球队的关系
emp.setTeam(team);
Emp emp1 = new Emp();
emp1.setEname("菲尔");
emp1.setAddress("芝加哥");
emp1.setBirthday(new Date());
emp1.setGender(1);
emp1.setTeam(team);
Set<Emp> set = new HashSet<Emp>();
set.add(emp);
set.add(emp1);
team.setSet(set);
//保存球队
session.save(team);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtils.closeResource(session);
}
}