Hibernate 关系映射

来源:互联网 发布:fiio music 软件 编辑:程序博客网 时间:2024/06/05 00:20

 1.。多对一

 

幻灯片17

public class Department {

private int id;

private String name;

 //getter和setter方法略

}

 

public class Employee {

private int id;

private String name;

private Department depart;

 //getter和setter方法略

}

在xxx.hbm.xml配置:           

Department.hbm.xml

<hibernate-mappingpackage="com.yinger.domain">

         <classname="Department">

               <idname="id">

                     <generatorclass="native" />

                </id>

               <propertyname="name"/>

          </class>

</hibernate-mapping>

 

Employee.hbm.xml

<hibernate-mappingpackage="com.yinger.domain">

        <classname="Employee">

               <idname="id">

                        <generator class="native" />

              </id><property name="name"/>

             <!-- 多对一映射 name是对应的属性名 column是对应的表的字段名[可以不指定]Hibernate 会自动的根据数据库中的

                 这个字段的值到属性对应的类对应的表里查找对象 -->

             <many-to-one name="depart" column="depart_id"></many-to-one>

         </class>

</hibernate-mapping>

 

 

 

2.一对多映射

 

幻灯片18

在原有的 Department.java 中添加

属性  private Set<Employee> emps;  以及相应的get和set方法

删掉 Employee.hbm.xml 中的多对一映射

修改 Department.hbm.xml 添加

<!-- 一对多的映射,key属性一定要有,指定字段名,这个字段是“多”的那个表中的字段名 class属性是指set中的元素的类型 -->

<setname="emps">

         <keycolumn="depart_id" />

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

 </set>

 

 

 

 

 

 

 

3.一对一映射

 

两种映射方法:① 基于主键的 一对一

 

幻灯片19

 

② 基于外键的 一对一

幻灯片20

public class Person {

               private int id;

                private String name;

                private IdCard idCard; //对象

 //getter和setter方法略

}

public class IdCard {

           private int id;

              private Date life;

            private Person person; //对象

 //getter和setter方法略

}

 

添加 映射文件

如果是第一种,基于主键的一对一:此时 person表中id和id_card 表中的id一一对应

Person.hbm.xml

<hibernate-mappingpackage="com.yinger.domain">

         <classname="Person">

                  <idname="id">

                        <generatorclass="native" />

                 </id>

                 <propertyname="name"/>

           </class>

</hibernate-mapping>

IdCard.hbm.xml

hibernate-mapping package="com.yinger.domain">

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

                    <id name="id"

                      <generatorclass="foreign">

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

                      </generator>

                   </id>

                   <propertyname="life" />

                  <one-to-onename="person" constrained="true"/>

              </class>

</hibernate-mapping>

 

 

如果是第二种,基于外键的一对一:此时 id_card 表中的字段 person_id 与 person 表中的 id对应

Person.hbm.xml

<hibernate-mapping package="com.yinger.domain">

     <class name="Person">

          <idname="id">

              <generatorclass="native" />

          </id>

           <propertyname="name"/>

      </class>

 </hibernate-mapping>

IdCard.hbm.xml

<hibernate-mapping package="com.yinger.domain">

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

           <!-- 基于外键的一对一映射,加上了unique="true"约束,相当于就是一对一映射首先假设多个idCard对应一个person,但是加上了unique约束之后就变成了一个idCard对应一个person-->

             <idname="id">

                           <generatorclass="native" />

                    </id><property name="life" />

             <many-to-onename="person" column="person_id" unique="true">

                </many-to-one></class><

/hibernate-mapping>

 

 

幻灯片32

幻灯片33

幻灯片34

 

使用原则:多数情况下都是使用set,需要保证顺序使用list,但是想用List而又不需要保证顺序使用bag

幻灯片35

 

注意点:

① 定义成 Set,而不是 HashSet

② 原来是 HashSet,保存了之后就不再是 HashSet 了,强制转型时会报错的!

原因是Hibernate进行的封装,变成了 PersistentSet,实现了 Set 接口,但是和 HashSet 没有关系,不能转型!

 

关系级联的设置

cascade:关系级联的处理方式,默认是 none

多对多和多对一 一般不配置级联

一对一 一般是 delete(前提是主从对象是同生共死的关系)

一对多 一般是 save-update

delete 就是说,比如删除一个部门,那么就要删除这个部门的所有的员工,这个一般是不符合实际的

 

inverse :是否放弃维护关联关系

如果是true的话,当某个对象是持久对象时,如果和它关联的对象发生了改变,Hibernate是不会产生update语句来进行更新的,所以会产生错误

注意:如果是true的话,那么一对多中的“多”一定要被告知是对应哪个“一”,否则数据库中“一”的字段会出现 null!

 

幻灯片36

 

 

 

 

 

 

 

原创粉丝点击