Hibernate 关系映射

 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-mapping package="com.yinger.domain">

         <class name="Department">

               <id name="id">

                     <generator class="native" />

                </id>

               <property name="name"/>

          </class>

</hibernate-mapping>

 

Employee.hbm.xml

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

        <class name="Employee">

               <id name="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中的元素的类型 -->

<set name="emps">

         <key column="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-mapping package="com.yinger.domain">

         <class name="Person">

                  <id name="id">

                        <generator class="native" />

                 </id>

                 <property name="name"/>

           </class>

</hibernate-mapping>

IdCard.hbm.xml

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

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

                    <id name="id"

                      <generator class="foreign">

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

                      </generator>

                   </id>

                   <property name="life" />

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

              </class>

</hibernate-mapping>

 

 

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

Person.hbm.xml

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

     <class name="Person">

          <id name="id">

              <generator class="native" />

          </id>

           <property name="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 -->

             <id name="id">

                           <generator class="native" />

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

             <many-to-one name="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

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值