6.Hibernate关联映射(多对一、双向一对多、双向多对多)

文章详细介绍了Hibernate中的关联映射,包括如何建立单向多对一和双向一对多的关联关系。在单向多对一关联中,涉及了在持久化类中添加属性、映射文件配置以及增删改查的操作。在双向一对多关联中,增加了在一端的集合类型属性并配置映射文件,同时展示了如何进行持久化操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录


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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未禾

您的支持是我最宝贵的财富!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值