欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

hibernate的关联映射

程序员文章站 2022-04-19 11:01:22
...
[size=large]

    前面介绍的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]