zoukankan      html  css  js  c++  java
  • Hibernate持久化类属性映射

         Hibernate充当应用程序和数据库之间的中间件,实现二者之间的交互操作,他对JDBC进行了封装,以完全面向对象的方式来操作数据。

    适用于有多个数据源的情况下,不必去考虑不同数据源的操作差异。

         Hibernate将类型对象与数据库表建立映射关系,把类的属性映射称为数据库表的字段,Hibernate属性映射可分为简单属性映射、集合属性

    映射、复合属性映射及派生属性映射。下面分别以实例介绍这几个映射及其对应的映射文件表示方式。

    1、简单属性

         假设有个User类,对应数据库中的User表

         User类中的属性包括:                   <--------------->        user_info表中对应字段:

              id: int                                                                    id: primary key

              name: String                                                          name

              age:  int                                                                 age

              birthday: Date                                                         birthday

              salary:  float                                                            salary

        则可在*.hbm.xml中配置类对象到数据库表的映射关系如下(User.hbm.xml):

          

     1 <hibernate-mapping package="com.pattywgm.a_simple_test">
     2     <!--对象到表的映射 -->
     3     <class name="User" table="user_info">
     4         <!-- 
     5            id元素: 表示对象标识符OID即数据库表的主键
     6                          属性:type 元素类型
     7                column 数据库表中对应的列名
     8         -->
     9         <id name="id" type="int" column="id">
    10             <!-- 
    11                generator元素表示主键生成策略
    12                native:根据底层数据库自动选择主键生成方式,identity,sequence,hilo
    13              -->
    14             <generator class="native"/>
    15         </id>
    16         <!--属性到列的映射 -->
    17         <property name="age" type="int" column="age"></property>
    18         <property name="name" type="string" column="name"/>    
    19         <property name="birthday" type="date" column="birthday"/>    
    20         <property name="salary" type="float" column="salary"/>    
    21     </class>
    22 
    23 </hibernate-mapping>
    View Code

    2、Set集合

        有时候一个类对象可能存在某个属性对应多个值,这种情况下若希望每个值都是不重复的就得选用Set集合,如User用户可能对应多个地址(土豪、房多),这时候

    从面向对象的角度将就是用一个Set来存放用户的地址信息而保证不重复,从数据库的角度将,我们可以建立一个关联的表address,表外键为user_id对应user_info表的

    主键id。

         

     1 <!-- set集合的映射 
     2             table属性:集合表的名称
     3             key子元素:集合外键的列名
     4             element子元素:存放集合元素的列的信息
     5             sort属性:"unsorted|natural|comparatorClass"
     6                 默认为:unsorted
     7             order-by属性:写的是order by 子句,是SQL语句,是操作的集合表。
     8                 这是在查询数据时指定orderby子句。
     9         -->
    10         <set name="address" table="address" sort="natural">
    11            <key column="user_id" not-null="true"></key>
    12            <element column="address" type="string" length="50"></element>
    13         </set>
    Set集合映射

     3、List、Bag、Array映射

         很多时候,可能对于某样东西我们不仅有很多个,发烧级的还会同样的东西买多个,这个时候可以使用List来保存,同时干净整洁的达人们一般都会尽然有序的排放

    整齐自己的东西啦,要是阁下豁出去了,承认自个儿就这么随意,尽情打包到Bag中吧。现在假设User的不少用户都是运动鞋发烧友了哈,这样建立一个与每个user相

    关的爱鞋维护,放在user_shoesList表中,在User.hbm.xml映射文件中的配置如下:

         

     1 <!-- List集合 
     2         key:外键列
     3     list-index:用于存放索引的列(有序),这样数据库表中就不会有重复项了
     4     key + list-index ==> primary key
     5         -->
     6 <list name="shoes" table="user_shoesList">
     7     <key column="user_id" not-null="true"></key>
     8     <list-index column="shoe_idx"></list-index>
     9     <element column="shoe" type="string"></element>
    10 </list>
    List映射

         Bag的映射类似于List,另外Array的映射也基本同于List,这里做几点说明:

         1)Set集合中的元素不重复且无序的,映射 Set 集合属性时, 如果 element 元素包括 not-null = “true” 属性,
             则集合属性表以关联持久化类的外键和元素列作为联合主键,否则该表没有主键。

              

              注意:此处Key为MUL表示该列的值可以重复,该列是一个非唯一索引的前导列(第一列)或者是一个唯一性索引的组成部分。 

         2)List中的元素是可重复但有序的,List 集合属性总是以外键列key和元素索引序列list-index作为联合主键

              

         3 )Bag中的元素可重复且无序,bag 元素既可以为 List 集合属性映射,也可以为 Collection 集合属性映射。
              不管是哪种集合属性,使用 bag 元素都将被映射成无序集合,而集合属性对应的表没有主键
              Bag 元素只需要 key 元素来映射外键列,使用 element 元素来映射集合属性的每个元素。

    4、Map映射

        在需要key-value对的场合,就需要用到map了,这时候不仅要映射map属性,还要表达他的key-value映射。假设为User表的每个用户添加家庭成员关系。

    Map中以外键列及key值对应列作为联合主键。

              

         

     1 <!-- 
     2            map映射
     3             key元素:指示外键列
     4             map-key元素: 指示集合的key值,必须有type属性
     5             element元素: 指示集合的value值,必须有type属性   
     6 -->
     7 <map name="family" table="user_family">
     8        <key column="user_id"></key>
     9        <map-key column="appellation" type="string"></map-key>
    10        <element column="name" type="string"></element>
    11 </map>
    Map映射

    5、组成关系映射Component

         有时候,关系映射不仅限于基本数据类型,对于组成关系(如User对象与Car对象)之间,hibernate提供了component实现组合关系的映射。现在,

    我们假设每个用户user有一辆车对应Car类,包括color、money、logo三个属性,修改表的结构,我们需要提供每个User对象的新的映射,该映射中包括

    其到Car对象的映射如下:

         

     1 <!-- 
     2             组成关系映射
     3             class元素:组合关系所对应的实体类Car
     4             property元素:表示Car类中的属性到数据库表user_info中列名的映射
     5          -->
     6 <component name="car" class="Car">
     7       <property name="money" column="car_cost" type="float">   </property>
     8     <property name="color" column="car_color" type="string"></property>
     9     <property name="logo" column="car_logo" type="string"></property>
    10 </component>
    Component组合关系映射

    在数据库表中的体现:

              

         集合除了存放 基本数据类型及其包装类型、String 字符串、日期类型以外,还可以存放组件类型。实际上,更多情况下,集合组件存放的都是组件类型

             a> 对于有集合属性持久化类, 需要使用 set, list, bag 等集合元素来映射集合属性。
        b> 如果集合里的元素是普通字符串,则使用 element 映射集合元素即可。
        c> 如果集合元素也是定义类,则需使用 composite-element 子元素来映射集合元素。
          composite-element 元素映射一个组件类型,因此需要 class 元素确定元素的类
            型,该元素还支持 property 的子元素来定义组件类型的子属性

        下面为每个用户添加jobs属性,放在一个set集合中,表示该用户的工作经历,则映射文件如下:

          

     1 <!-- 
     2             集合元素为组成关系的映射
     3             composite-element: 表示set中元素为组合类型
     4             class元素:组合关系所对应的实体类Car
     5             property元素:表示Car类中的属性到数据库表user_info中列名的映射
     6          -->
     7          <set name="jobs" table="user_jobs">
     8              <key column="user_id" not-null="true"></key>
     9              <composite-element class="Job">
    10                  <!-- job_name设为非空,则与user_id共同构成user_jobs表的主键 -->
    11                 <property name="job_name" type="string" column="job_name" not-null="true"></property>
    12                 <property name="begin_time" type="date" column="begin_time"></property>
    13                 <property name="company" type="string" column="company"></property>
    14              </composite-element>
    15          </set>
    Set+Component

         在数据库中的反应如下,注意user_id和job_name共同构成表的主键:

          

  • 相关阅读:
    关于敏捷开发的一些思考。
    【转】浅谈程序猿的职业规划,看你如何决定自己的未来吧。
    Individual Project
    homework_06 围棋程序改进
    homework 08_2 C++11新特性作业之二
    homework_08
    软件工程个人作业——Agile Software Development读后感
    附加题——软件工程之结对编程
    软件工程——PairProject
    软件工程第一次个人项目——词频统计by11061153柴泽华
  • 原文地址:https://www.cnblogs.com/java-wgm/p/4652701.html
Copyright © 2011-2022 走看看