hibernate的关联映射
程序员文章站
2022-04-19 11:01:22
...
[size=large]
前面介绍的Hibernate基本映射能反映出实例类和数据表格之间的映射关系,但若要体现出表格和表格、实体类和实体类之间的关系, 还得用到关联映射。
hibernate中的关联映射包括一对多(和多对一)、多对多、组件映射和继承。下面以学生选课系统为例介绍前两者。(这个系统中暂时还没有能反映组件映射和继承的表格, 很难空口讲清楚, 所以今天不说这两个了...)
一对多映射。在学生选课系统中, 专业和学生(n方和1方)之间是很明显的一对多关系:一个专业中包含很多(>=1)学生。这种关系用代码来实现的步骤为(在基本映射的基础上):
1. 在专业Major类(n方)中添加Set<Stu> stus属性(1方), 并添加相应的setter和getter方法:
在Major.hbm.xml中添加:
2. 在学生Stu类(1方)中添加n方的属性字段:
在其映射文件中添加:
这样,Major和Stu之间的一对多和多对一关系就配置完成了.也可以按照需求只对一方进行配置。
然后测试。使用关联映射时注意不要过早关闭session,因为它使用了延迟加载。若想取消延迟加载, 可在关联元素中添加fetch="join"(在上篇总结中说过, 不推荐这样写)。
一对多映射也可以使用List集合, 但在配置文件上更麻烦, 对数据表格也有特殊的要求, 所以, 若能使用Set, 就尽量使用Set.
使用关联映射进行查询的效果类似于多表查询, 而使用它进行数据的增删改操作则可以达到sql的级联操作效果。
如:
这段代码不仅往数据库里添加了一个stu记录, 还添加了一个新的major记录。在运行代码之前还需要添加一个配置:
在Stu.hbm.xml中的major属性中添加:cascade="all",它的意思是允许所有级联操作。若少了这个配置, 运行时会报错。
在级联操作中还有关系维护问题, 在此就不多说了^^.
测试代码见TestOneToMany类.
多对多映射。 一名学生可以同时选多门课程, 一门课程也可以同时有很多学生来选. 所以在stu表和course表之间存在着多对多关系.
多对多关系的建立除了需要两个n方(stu和course)外, 还需要一张关联表(stu_course)来定义两个n方的对应关系。
此映射的代码实现过程为:
1. 在两个n方实体类中分别添加对方的set集合属性及set和get方法, 如在Stu类中:
在两个映射文件中添加元素:
<set name="属性名" table="关联表名">
<key column="此类在关联表中对应的列"></key>
<many-to-many class="另一方的类名" column="另一方在关联表中对应的列"></many-to-many>
</set>
如在stu.hbm.xml中添加:
然后, 测试(见TestManyToMany类。 写一部分测一部分应该是一个好习惯吧!)
[/size]
前面介绍的Hibernate基本映射能反映出实例类和数据表格之间的映射关系,但若要体现出表格和表格、实体类和实体类之间的关系, 还得用到关联映射。
hibernate中的关联映射包括一对多(和多对一)、多对多、组件映射和继承。下面以学生选课系统为例介绍前两者。(这个系统中暂时还没有能反映组件映射和继承的表格, 很难空口讲清楚, 所以今天不说这两个了...)
一对多映射。在学生选课系统中, 专业和学生(n方和1方)之间是很明显的一对多关系:一个专业中包含很多(>=1)学生。这种关系用代码来实现的步骤为(在基本映射的基础上):
1. 在专业Major类(n方)中添加Set<Stu> stus属性(1方), 并添加相应的setter和getter方法:
private Set<Stu>stus; public Set<Stu> getStus() { return stus; } public void setStus(Set<Stu> stus) { this.stus = stus; }
在Major.hbm.xml中添加:
<!--一对多--> <!--name为属性名;column为1方表中的外键列--> <set name="stus"> <key column="major_id"/> <one-to-many class="blog.pojo.Stu"/> </set>
2. 在学生Stu类(1方)中添加n方的属性字段:
private Major major; public Major getMajor() { return this.major; } public void setMajor(Major major) { this.major = major; }
在其映射文件中添加:
<many-to-one name="major" class="blog.pojo.Major" column="major_id"/>
这样,Major和Stu之间的一对多和多对一关系就配置完成了.也可以按照需求只对一方进行配置。
然后测试。使用关联映射时注意不要过早关闭session,因为它使用了延迟加载。若想取消延迟加载, 可在关联元素中添加fetch="join"(在上篇总结中说过, 不推荐这样写)。
一对多映射也可以使用List集合, 但在配置文件上更麻烦, 对数据表格也有特殊的要求, 所以, 若能使用Set, 就尽量使用Set.
使用关联映射进行查询的效果类似于多表查询, 而使用它进行数据的增删改操作则可以达到sql的级联操作效果。
如:
Stu stu=new Stu(); stu.setName("LiHua"); Major major=new Major(); major.setName("Literature"); major.setStuNum(100); stu.setMajor(major); Session session=HibernateSessionFactory.getSession(); Transaction tx=session.beginTransaction(); session.save(stu); tx.commit(); session.close();
这段代码不仅往数据库里添加了一个stu记录, 还添加了一个新的major记录。在运行代码之前还需要添加一个配置:
在Stu.hbm.xml中的major属性中添加:cascade="all",它的意思是允许所有级联操作。若少了这个配置, 运行时会报错。
在级联操作中还有关系维护问题, 在此就不多说了^^.
测试代码见TestOneToMany类.
多对多映射。 一名学生可以同时选多门课程, 一门课程也可以同时有很多学生来选. 所以在stu表和course表之间存在着多对多关系.
多对多关系的建立除了需要两个n方(stu和course)外, 还需要一张关联表(stu_course)来定义两个n方的对应关系。
此映射的代码实现过程为:
1. 在两个n方实体类中分别添加对方的set集合属性及set和get方法, 如在Stu类中:
private Set<Course>courses; public Set<Course> getCourses() { return courses; } public void setCourses(Set<Course> courses) { this.courses = courses; }
在两个映射文件中添加元素:
<set name="属性名" table="关联表名">
<key column="此类在关联表中对应的列"></key>
<many-to-many class="另一方的类名" column="另一方在关联表中对应的列"></many-to-many>
</set>
如在stu.hbm.xml中添加:
<set name="courses" table="stu_course"> <key column="stu_id"></key> <many-to-many class="blog.pojo.Course" column="course_id"></many-to-many> </set>
然后, 测试(见TestManyToMany类。 写一部分测一部分应该是一个好习惯吧!)
[/size]
下一篇: 揭秘:昌邑王刘贺被废的真正原因是什么?