hibernate第二章:关联映射2

双向一对多:

前面说到了单向一对多,单向多对一。希望大家都有了一定的了解。现在我们说下双向一对多。

什么是双向一对多:同时配置了单向一对多,和单向多对一,就成了双向一对多关联。

和前面谈到的一样:Dorm(宿舍),Student(学生)

数据库脚本也和上一章节一样。所以就不在这里贴了。

只写出不同的地方,最后会上传源码,供大家探讨。

Dorm.java  添加set集合保存student信息

private Set<Student> students=new HashSet<Student>();


Dorm.hbm.xml

<!-- 配置双向一对多 -->
		<set name="students">
			<key>
				<column name="dorm_id"></column>
			</key>
			<one-to-many class="org.wiksys.chap02.bean.Student"/>	
		</set>


Student.java 

//设置少的一方属性
private Dorm dorm;

Student.hbm.xml不做变化,测试可以从前面一张获取。

两个测试,分别测试多对一添加数据,一对多添加数据。

这里我们可以看出。双向多对一就是单向一对多和单向多对一的组合。

 

两个属性:cascade和inverse

配置关联时,我们需要考虑两点:程序执行效率和实际业务需要。在前面的练习中无论是单向的关联还是双向的关联,我们都需要session.save()才能保存到数据库。如果数据量很大,将非常痛苦。

此时,我们只需要在set中添加一个属性,cascade,即可持久化关联的其他瞬时对象。

demo:只需要修改上面的set即可

<set name="students" cascade="all">
			<key>
				<column name="dorm_id"></column>
			</key>
			<one-to-many class="org.wiksys.chap02.bean.Student"/>	
		</set>

然后测试添加:

Student student=new Student();
		student.setName("hack");
		
		Dorm dorm = new Dorm();
		dorm.setName("106");
		dorm.getStudents().add(student);

		SessionFactory sf=null;
		Session session=null;
		Transaction tx=null;
		try {
			sf=new Configuration().configure().buildSessionFactory();
			session=sf.openSession();
			tx=session.beginTransaction();
			session.save(dorm);
			tx.commit();
		} catch (HibernateException e) {
			tx.rollback();
			e.printStackTrace();
		} finally {
			session.close();
			sf.close();
		}

我们查看打印的SQL语句:

Hibernate: select hibernate_sequence.nextval from dual
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: insert into dorm (name, id) values (?, ?)
Hibernate: insert into student (dorm_id, name, id) values (?, ?, ?)
Hibernate: update student set dorm_id=? where id=?

可以看出,效果是一样的,编码却有了明显的改善。

cascade属性的常用属性值

属性值含义和作用
all对所有操作进行级联操作
save-update对所有添加,更新进行级联
delete对所有删除进行级联操作
none对所有操作不进行级联操作,默认值

 inverse:反转指定关联关系中的方向。为false的是主动放,有主动方负责维护关联关系。这里就不做演示了。可以在set中添加这个属性进行测试下。

在这里明确一个概念性的东西:

inverse和cascade是两个互不相干的概念。inverse控制方向。cascade指的是层级之间的连锁操作。

要根据需要使用,否则会大大降低性能。

 

本章所需要的jar包http://download.csdn.net/detail/wiksys/4545524

本子源代码地址:http://download.csdn.net/detail/wiksys/4554623

 当然,还有一个多对多关联:留给下章。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wiksys

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值