`

Hibernateday03学习笔记

 
阅读更多

1.Hibernate关联关系
 一对一的关联关系
  1) 共享主键:两个对象联系紧密
       子表:主键同时又是外键(是父表的主键)
       父表
类          Person     Idcard
关系属性     idCard     person
      映射文件中:
      <class name="父表" table="xx">
       <id name="xx" column="xxx">
         <generator class="increment"/><!--主键由自己控制-->
       </id>
       ..
      <!--关系属性 四个要素
        1.关系属性  name
    2.关系属性的类对应的表  class
    3.外键
    4.级联
      -->
      <one-to-one name="关系属性" class="关系属性的全路径" cascade="all"></one-to-one>
      </class>
      <class name="子表" table="xxxx">
        <id name="xx" column="xxxxx">
         <generator class="foreign"><!--子表的主键不由自动控制-->
        <param name="property">关系属性名</param>
     </generator>
        </id>
        <!--constrained="true" 明确父子关系-->
      <one-to-one name="xxx" class="xxxx" cascade="all" constrained="true"></one-to-one>
      </class>
  2)唯一外键:
    子表:会添加一个外键列(父表的主键),通过配置文件加上唯一性约束
    父表:
      <class name="xxxx" table="父表">
        <id name="xx" column="xxxx">
           <generator class="increment"/>
        </id>
    ...
    <!--关系属性-->
    <one-to-one name="xxx" class="xxxxx" cascade="save-update"
                property-ref="关系属性"></one-to-one>
      </class>
      <class  name="xxx" table="子表">
         <id name="xx" column="xxxx">
           <generator class="increment"/>
        </id>
    ...
    <!--关系属性 子表有外键,外键的本质就是多对一-->
    <many-to-one unique="true" name="xxx" class="xxxx"
                 column="外键列" cascade="save-update" ></many-to-one>
      </class>

在使用hibernate的API
    1.传递性持久化:在对对象进行操作时会将与其关联的对象执行相关操作
    2.hibernate操作的是内存当中的对象,不会直接操作数据库中的数据,在处理有关联关系
      的对象时要先在内存中解除他们的关系。

一对多  1:*
             Employee        Dept  一个员工对应一个部门,一个部门对应多个员工
                *              1
关系属性      Dept      Set<Employee> emps=new HashSet<Employee>();
    为什么要使用Set:
       1.Set可以去重复
       2.如果关系属性是一个集合,要使用set接口类型,而不能使用Hashset,也Hibernate   延迟加载有关系
   对象之间的单向和双向关系由业务需求而定

建表
   t_employee
     普通的列 + 外键列 d_id

   t_dept
     普通的列

cascade='save-update' 删除时要解除关系
  1.如果删除的当前对象能够从<class>标签中获得明确的外键信息
    无须再内存中解除关系直接删除
  2.如果删除的对象从<class>标签中不能获得明确的外键信息
    必须现在内存中解除关系,再删除 注意 inverse="true"的配置会使<key标签失效>
 
     一般为没有明确外键信息的对象提供解除关系的工具方法

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics