zoukankan      html  css  js  c++  java
  • Hibernate 关联关系映射实例

    双向多对一/一对多(many-to-one/one-to-many)

    例子,多个学生对应一个班级,一个班级对应多个学生:

    班级类,Grade.java:

    public class Grade {
    
        private Integer id;
        private String name;
        private String description;
        //学生集合
        private Set<Student> students = new HashSet<Student>();
        
        //省略get,set方法......
    
    }

    学生类,Student.java

    public class Student {
    
        private Integer id;
        private String name;
        private String sex;
        //班级引用
        private Grade grade;
        
        //省略get,set方法.......
        
    }

    班级类(一的一方)映射文件,Grade.hbm.xml:

    <hibernate-mapping package="accp.hib">
        <class name="Grade" table="Grade" >
            <id name="id" column="id">
                <generator class="native" />
            </id>
            <property name="name" column="name" type="string" />
            <property name="description" type="string" column="description" />
            <!-- 映射学生类集合 -->
            <set name="students" inverse="true">
                <key column="grade_id" />
                <one-to-many class="Student"/>
            </set>
        </class>
    </hibernate-mapping>

    学生类(多的一方)映射文件,Student.hbm.xml:

    <hibernate-mapping package="accp.hib">
        <class name="Student" table="Student">
            <id name="id" column="id">
                <generator class="native" />
            </id>
            <property name="name" column="name" type="string" />
            <property name="sex" type="string" column="sex" />
            <!-- 映射班级类引用 -->
            <many-to-one name="grade" class="Grade" column="grade_id" cascade="save-update"/>
        </class>
    </hibernate-mapping>

    双向一对一(One-to-one)

    例子,一个学生对应一个学生证,一个学生证对应一个学生:

    学生类,Student.java

    public class Student {
        private Integer id;
        private String name;
        private String sex;
        //学生证类 引用
        private Paper paper;
        
        //省略get,set方法......
    }

    学生证类,Paper.java

    public class Paper {
    
        private Integer id;
        private String description;
        //学生类引用
        private Student student;
        
        //省略get,set方法.....  
    }

    学生类(无外键一方)映射文件,Student.hbm.xml:

    <hibernate-mapping package="accp.hib">
        <class name="Student" table="Student">
            <id name="id" column="id">
                <generator class="native" />
            </id>
            <property name="name" column="name" type="string" />
            <property name="sex" type="string" column="sex" />
            <!-- 映射学生证类 -->
            <one-to-one name="paper" class="Paper" />
        </class>
    </hibernate-mapping>

    学生证类(有外键一方)映射文件,Paper.hbm.xml:

    <hibernate-mapping package="accp.hib">
        <class name="Paper" table="Paper" >
            <id name="id" column="id">
                <generator class="native" />
            </id>
            <property name="description" type="string" column="description" />
            <!-- 映射学生类 -->
            <many-to-one name="student" column="student_id" class="Student" unique="true" cascade="save-update"/>
        </class>
    </hibernate-mapping>

    要数据库中,外键会建立在写有 many-to-one 所映射的表中,也就是paper类所映射的表。

    双向多对多(many-to-many)

    例子,多个学生对应多门课程,多门课程也对应多个学生:

    学生类,Student.java

    public class Student {
        private Integer id;
        private String name;
        private String sex;
        //课程类集合
        private Set<Course> courses = new HashSet<Course>();
        
        //省略get,set方法.......
    }

    课程类,Course.java

    public class Course {
        private Integer id;
        private String name;
        //学生类集合
        private Set<Student> students = new HashSet<Student>();
        
        //省略get,set方法.......
    }

    学生类映射文件,Student.hbm.xml:

    <hibernate-mapping package="accp.hib">
        <class name="Student" table="Student">
            <id name="id" column="id">
                <generator class="native" />
            </id>
            <property name="name" column="name" type="string" />
            <property name="sex" type="string" column="sex" />
            <!-- 映射课程类集合 -->
            <set name="courses" table="sc">
                <key column="student_id" />
                <many-to-many column="course_id" class="Course"/>
            </set>
        </class>
    </hibernate-mapping>

    课程类映射文件,Course.hbm.xml:

    <hibernate-mapping package="accp.hib">
        <class name="Course" table="Course" >
            <id name="id" column="id">
                <generator class="native" />
            </id>
            <property name="name" column="name" type="string" />
            <!-- 映射学生类集合 -->
            <set name="students" table="sc" inverse="true">
                <key column="course_id" />
                <many-to-many column="student_id" class="Student" />
            </set>
        </class>
    </hibernate-mapping>

    会新建一张名为 sc 的中间表,该表拥有student和course的外键,通过该中间表为student和course建立多对多关系。

  • 相关阅读:
    woocommerce调用产品相册gallery图片如何操作?wordpress技巧
    phpcms切换到php7.2后无法修改文章提示Uncaught Error: [] operator not supported for strings
    yandexbot ip列表整理做俄罗斯市场的站长可以关注一下
    phpcms网站迁移无法更新内容提示Table 'led_com.lz_' doesn't exist的解决方法
    phpcms邮箱smtp配置163企业邮测试可用
    phpcms添加https后台分页错误的解决方法
    linux防止恶意采集攻防战
    ThinkPHP获取当前页URL添加canonical
    如何让ThinkPHP支持模糊搜索
    火车头内容发布规则为保存本地文件时的注意事项
  • 原文地址:https://www.cnblogs.com/likailan/p/3427093.html
Copyright © 2011-2022 走看看