hibernate第二章:关联映射2

来源:互联网 发布:用友软件t6价格 编辑:程序博客网 时间:2024/05/24 05:04

双向一对多:

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

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

和前面谈到的一样: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 dualHibernate: select hibernate_sequence.nextval from dualHibernate: 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

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