目录
Hibernate关联映射(多对一、双向一对多、双向多对多)
关联关系
类与类之间最普遍的关系就是关联关系,而且关联是有方向的。
以部门表(Depe)与员工表(Emp)为例:
①一个部门下有多个员工,而一个员工只能属于一个部门。
②从Emp到Dept的关联是多对一关联,这就意味着每个Emp对象只会引用一个Dept对象
③从而Dept到Emp是一对多的关联,这就意味着每个Dept对象会引用一组Emp对象
因此,在Emp类中应该定义一个Dept类型的属性,来引用所关联的Dept对象;而在Dept类中一个定义个一个集合类型的属性,来引用所有关联的Emp对象。
建立单向多对一关联关系
配置单向多对一关联:Emp(员工)多、Dept(部门)一
1.持久化类(多)
// 在Emp(多)中添加Dept(少)类型属性
private Dept dept;
2.映射文件(写在多的映射文件当中)
<many-to-one name="dept"
column="DEPTNO"
class="com.my.entity.Dept"></many-to-one>
<many-to-one>元素建立了此表外键和他表属性之间的映射
(1)name:设定持久化类的属性名
(2)column:设定持久化类的属性对应的表的主键
(3)class:设定持久化类的属性的类型
3.实现持久化操作
具体操作与之前操作差不多
(1)增加
Transaction tx = HibernateUtil.getCurrentSession().beginTransaction();
Emp emp = new Emp();
emp.setName("赵子龙");
emp.setAge(25);
emp.setAddress("荆州");
Dept d = new Dept();
d.setId(2);
emp.setDept(d);
HibernateUtil.getCurrentSession().save(emp);
tx.commit();
(2)删除
Transaction tx = HibernateUtil.getCurrentSession().beginTransaction();
Emp emp = HibernateUtil.getCurrentSession().load(Emp.class, 1);
HibernateUtil.getCurrentSession().delete(4);
// 也可以先加载,再删除
tx.commit();
(3)修改
Transaction tx = HibernateUtil.getCurrentSession().beginTransaction();
Emp emp = new Emp();
emp.setName("刘备");
emp.setId(1);
emp.setAge(21);
emp.setAddress("荆州");
Dept d = new Dept();
d.setId(2);
emp.setDept(d);
HibernateUtil.getCurrentSession().update(emp);
// 按ID修改,,也可先加载,再修改
tx.commit();
(4)查询
Transaction tx = HibernateUtil.getCurrentSession().beginTransaction();
List<Emp> list = HibernateUtil.getCurrentSession().createQuery("from Emp").list();
for(Emp emp : list) {
System.out.println(emp.getName());
System.out.println(emp.getDept().getName());
}
tx.commit();
建立双向一对多关联关系
即在多对一的基础上,增加一对多的的关联,就构成了双向一对多映射。
1.增加多的集合类型的属性(一)
private Set<Emp> emps = new HashSet<Emp>();
2.在映射文件中配置(一)
<set name="emps">
<key column="DEPTNO"></key>
<one-to-many class="com.my.entity.Emp" />
</set>
<set>元素的name属性:设定持久化类的属性名
<set>元素包含两个子元素:
<key>元素:column属性设定与所关联的持久化类相对应的表的外键
<one-to-many>元素:class属性设定所关联的持久化类(路径)
<set>元素:表明Dept类用emps的属性为java.util.Set类型
<one-to-many>子元素:表明emps集合中存放的是一组Emp对象
<key>子元素:表明Emp表通过外键DEPTNO参照Dept表
3.实现持久化操作
(1)增加
//联级增加,要在Dept映射文件的set元素中国增加cascade=“save-update”
Dept d1 = new Dept();
d1.setName("后勤部");
Emp e = new Emp();
e.setName("孙仲谋");
e.setAge(24);
e.setAddress("江东");
e.setDept(d1);
d1.getEmps().add(e); //使用get得到属性,在设置Set集合
// 已经双向赋值
// 外键可以保障,可以去掉多余的update语句,在set元素中增加inverse="true"
Transaction tx = HibernateUtil.getCurrentSession().beginTransaction();
HibernateUtil.getCurrentSession().save(d1);
tx.commit();