分享

hibernate映射关系总结

 贾朋亮博客 2015-09-10

1       一对一

Person

IdCard

public class Person {

    private Integer id;

    private String name;

 

    private IdCard idCard;

 

public class IdCard {

    private Integer id;

    private String number;

 

    private Person person;

 

1.1     方式一

Person.hbm.xml

IdCard.hbm.xml

<hibernate-mapping package="cn.itcast.i_hbm_oneToOne">

   

    <class name="Person" table="person">

        <id name="id">

        <generator class="native"></generator>

        </id>

        <property name="name"/>

       

        <!-- idCard属性,IdCard类型。

            表达的是本类与IdCard的一对一。

            采用基于外键的一对一映射方式,本方无外键方。

            property-ref属性:

                写的是对方映射中外键列对应的属性名。

         -->

        <one-to-one name="idCard" class="IdCard" property-ref="person"/>

       

    </class>

   

</hibernate-mapping>

<hibernate-mapping package="cn.itcast.i_hbm_oneToOne">

   

    <class name="IdCard" table="idCard">

        <id name="id">

        <generator class="native"></generator>

        </id>

        <property name="number"/>

       

        <!-- person属性,Person类型。

            表达的是本类与Person的一对一。

            采用基于外键的一对一映射方式,本方有外键方。 -->

        <many-to-one name="person" class="Person" column="personId" unique="true"></many-to-one>

       

    </class>

   

</hibernate-mapping>

 

 

1.2     方式二

Person.hbm.xml

IdCard.hbm.xml

<hibernate-mapping package="cn.itcast.i_hbm_oneToOne2">

   

    <class name="Person" table="person2">

        <id name="id">

        <generator class="native"></generator>

        </id>

        <property name="name"/>

       

        <!-- idCard属性,IdCard类型。

            表达的是本类与IdCard的一对一。

            采用基于主键的一对一映射方式,本方无外键方。

         -->

        <one-to-one name="idCard" class="IdCard" ></one-to-one>

       

       

    </class>

   

</hibernate-mapping>

<hibernate-mapping package="cn.itcast.i_hbm_oneToOne2">

   

    <class name="IdCard" table="idCard2">

        <id name="id">

            <!-- 当使用基于主键的一对一映射时,

                有外键方的主键生成策略一定要是foreign

                参数property

                    生成主键值时所根据的对象。

             -->

        <generator class="foreign">

             <param name="property">person</param>

        </generator>

        </id>

        <property name="number"/>

       

        <!-- person属性,Person类型。

            表达的是本类与Person的一对一。

            采用基于主键的一对一映射方式,本方有外键方。 -->

        <one-to-one name="person" class="Person"  constrained="true"></one-to-one>

       

    </class>

   

</hibernate-mapping>

 

2       一对多

Employee

Department

public class Employee {

    private Integer id;

    private String name;

 

    private Department department;

public class Department {

    private Integer id;

    private String name;

 

    private Set<Employee> employees = new HashSet<Employee>();

 

Employee.hbm.xml

Department.hbm.xml

<hibernate-mapping package="cn.itcast.f_hbm_oneToMany">

   

    <class name="Employee" table="employee">

        <id name="id">

        <generator class="native"></generator>

        </id>

        <property name="name" type="string" column="name"/>

       

        <!-- department属性,表达的是本类与Department的多对一

            class属性:关联的实体类型

            column属性:外键列(引用关联对象的表的主键)

        -->

        <many-to-one name="department" class="Department" column="departmentId"></many-to-one>

       

    </class>

   

</hibernate-mapping>

<hibernate-mapping package="cn.itcast.f_hbm_oneToMany">

   

    <class name="Department" table="department">

        <id name="id">

        <generator class="native"></generator>

        </id>

        <property name="name"/>

       

        <!-- employees属性,Set集合,表达的是本类与Employee的一对多

            class属性:关联的实体类型

            key子元素:对方表中的外键列(多方的那个表)

           

            inverse属性:

                默认为false,表示本方维护关联关系。

                如果为true,表示本方不维护关联关系。

                只是影响是否能设置外键列的值(设成有效值或是null值),对获取信息没有影响。

               

            cascade属性:

                默认为none,代表不级联。

                级联是指操作主对象时,对关联的对象也做相同的操作。

                可设为:delete, save-update, all, none ...

               

            lazy属性:懒加载,默认为true

                true:懒加载,在第一次使用时加载。

                false:立即加载,在获取本对象时就加载这个集合的所有元素。

                extra:增强的懒加载策略。

        -->

        <set name="employees" cascade="all" lazy="true">

            <key column="departmentId"></key>

            <one-to-many class="Employee"/>

        </set>

       

    </class>

   

</hibernate-mapping>

 

3       多对多

Student

Teacher

public class Student {

    private Long id;

    private String name;

 

    private Set<Teacher> teachers = new HashSet<Teacher>();

public class Teacher {

    private Long id;

    private String name;

 

    private Set<Student> students = new HashSet<Student>();

 

 

Student.hbm.xml

Teacher.hbm.xml

<hibernate-mapping package="cn.itcast.g_hbm_manyToMany">

    <class name="Student" table="student">

        <id name="id">

        <generator class="native"></generator>

        </id>

        <property name="name"/>

       

        <!-- teachers属性,Set集合。

            表达的是本类与Teacher的多对多。

           

            table属性:中间表(集合表)

            key子元素:集合外键(引用当前表主键的那个外键)

         -->

        <set name="teachers" table="teacher_student" inverse="false">

            <key column="studentId"></key>

            <many-to-many class="Teacher" column="teacherId"></many-to-many>

        </set>

           

    </class>

   

</hibernate-mapping>

<hibernate-mapping package="cn.itcast.g_hbm_manyToMany">

   

    <class name="Teacher" table="teacher">

        <id name="id">

        <generator class="native"></generator>

        </id>

        <property name="name" type="string" column="name"/>

       

        <!-- students属性,Set集合。

            表达的是本类与Student的多对多。

         -->

        <set name="students" table="teacher_student" inverse="true">

            <key column="teacherId"></key>

            <many-to-many class="Student" column="studentId"></many-to-many>

        </set>

       

    </class>

   

</hibernate-mapping>

 


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多