双向一对多:
前面说到了单向一对多,单向多对一。希望大家都有了一定的了解。现在我们说下双向一对多。
什么是双向一对多:同时配置了单向一对多,和单向多对一,就成了双向一对多关联。
和前面谈到的一样: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.youkuaiyun.com/detail/wiksys/4545524
本子源代码地址:http://download.youkuaiyun.com/detail/wiksys/4554623
当然,还有一个多对多关联:留给下章。