现在的位置: 首页 > 综合 > 正文

hibernate第二章:关联映射2

2013年08月05日 ⁄ 综合 ⁄ 共 1932字 ⁄ 字号 评论关闭

双向一对多:

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

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

和前面谈到的一样: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

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

 

抱歉!评论已关闭.