JAVA高階程式設計之hibernate框架學習二

weixin_33670713發表於2016-07-06

hibernate對映關係

對映關係相關屬性詳解

  • name:屬性的名字,同時是對用類的屬性名字。

  • table:建立後的表名

  • class (可選 - 預設是通過反射得到的屬性型別):被關聯的類的名字。

  • column:主鍵對應的屬性名,key標籤的colum表示外來鍵

  • generator:表示主鍵的生成方式

    常見主鍵生成方式

    1.increment:主鍵遞增生成,其生成方式與底層資料庫無關,大部分資料庫都支援,該方式的實現機制是在當前應用例項中維持一個變數,以儲存著當前的最大值,之後每次需要生成主鍵的時候將此值加1作為轉。其不足之處是當多個執行緒併發對資料庫表進行寫操作時,可能出現相同的主鍵值,發生主鍵重複的衝突,所以在多執行緒併發操作的時候不應該使用該方法。

     <generator class="increment" />
    

    2.identity:與底層資料庫有關,要求資料庫支援Identity,如MySQL中auto_increment,SQL Server中的identity。支援的資料庫有MySQL,SQL Server,DB2,Sybase,但是不支援oracle.支援併發。

    <generator class="identity" />
    

    3.assigned:主鍵由外部程式負責生成,無需Hibernate參與。----如果要由程式程式碼來指定主鍵,就採有這種。

    <generator class="assigned" />
    

    4.sequence:使用序列生成主鍵,需要底層資料庫支援

    在資料庫中建一個序列
    
        create sequence seq_name increment by 1 start with 1;
        在對映檔案中指定使用序列的名字
        <generator class="sequence">
        <param name="sequence">seq_name</param>
       </generator>
    
  • property:普通屬性的標籤

  • constrained(約束) (可選):表明該類對應的表對應的資料庫表,和被關聯的物件所對應的資料庫表之間,通過一個外來鍵引用對主鍵進行約束。
    這個選項影響save()和delete()在級聯執行時的先後順序

  • unique:是在使用hibernate的自動建表的時候才用到,uniq="true"用來指定表中的外來鍵唯一,即給表中的外來鍵新增唯一性約束,保證是一對一的關係。

  • property-ref:用來指定關聯類的屬性名,這個屬性將會和本類中的主鍵相對應,如果沒有指定,預設使用關聯類的主鍵和本類中的主鍵相對應。

  • lazy:true/false,session是否延遲查詢所需要的物件的相關屬性

  • cascade(級聯) (可選):表明操作是否從父物件級聯到被關聯的物件。

    級聯的型別

    lazy="none":在儲存,更新,刪除當前物件的時候忽略其他關聯的物件。是cascade的預設值

    lazy="save-update":當通過Session的save(),update(),saveOrUpdate()方法來儲存或者更新當前物件的時候級聯儲存所有關聯的臨時物件,級聯更新所有關聯的遊離物件。

    lazy="delete":當通過Session的delete()方法刪除當前物件的時候級聯刪除所有關聯的物件。

    lazy="all":包含save-update和delete的行為。

    lazy="delete-orphan":刪除所有和當前物件解除關聯關係的物件。(只能在set中配置)

    lazy="all-delete-orphan": 包含all和delete-orphan的行為

  • inverse:負責控制關係,inverse真正的作用是指定由哪一方來維護之間的關聯關係,當一方指定inverse="false"那麼這一方就有責任負責之間的關聯關係。.需要將其中的一方inverse="true",預設為false,只能顯示在<set>放進行設定。

對映關係型別

  • 一對一
    一個人對應一張身份證,一張身份證對應一個人
    person配置檔案資訊:

      <?xml version="1.0" encoding="UTF-8"?>
       <!DOCTYPE hibernate-mapping PUBLIC 
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
      "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
      <hibernate-mapping package="com.briup.day05.one2one">
          <class name="Person" table="tbl_person">
                    <id name="id" column="id">
                    <generator class="increment" />
                    </id>
                   <property name="name" />
                    <!-- 在主方配置一對一 -->
                   <one-to-one name="card" class="Card" />
          </class>
      </hibernate-mapping>
    

card配置檔案資訊:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.briup.day05.one2one">

    <class name="Card" table="tbl_card">
        <id name="id" column="id">
            <generator class="increment" />
        </id>
        <property name="number"/>
        <property name="address"/>
        <many-to-one name="person" class="Person"
             unique="true"
            column="p_id"></many-to-one>
        <!-- column是外來鍵 -->
    </class>

    </hibernate-mapping>
  • 一對多
    一位顧客對應多個訂單,多個訂單對應一位顧客
    customer配置檔案資訊:

         <?xml version="1.0" encoding="UTF-8"?>
           <!DOCTYPE hibernate-mapping PUBLIC 
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
      "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
      <hibernate-mapping package="com.briup.day05.one2many">
    
         <class name="Customer" table="tbl_customer">
              <id name="id" column="id">
              <generator class="increment"/>
              </id>
              <property name="name"/>
              <property name="telephone"/>
              <property name="address"/>
      
            <!-- 關聯對映 -->
            <set name="orders">
               <key column="c_id"/>
               <one-to-many class="Order"/>
            </set>
      
         </class>
       </hibernate-mapping>
    
    *order配置檔案資訊:* 
    
        <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE hibernate-mapping PUBLIC 
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
      "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
      <hibernate-mapping package="com.briup.day05.one2many">
    
         <class name="Order" table="tbl_order">
                <id name="id" column="id">
                <generator class="increment"/>
                </id>
                <property name="total"/>
                <property name="orderDate"/>
                <!-- 關聯對映 -->
               <many-to-one name="customer" class="Customer"
               column="c_id" />
         </class>
      </hibernate-mapping>
    
  • 多對多
    多個學生對應多門課程,多門課程對應對個學生
    由於student和course都是多對多所以配置資訊一樣:
    配置檔案資訊:

      <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE hibernate-mapping PUBLIC 
          "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
      <hibernate-mapping package="com.briup.day06.many2many">
    
         <class name="Student" table="tbl_student">
               <id name="id" column="id">
               <generator class="increment" />
               </id>
               <property name="name" />
               <property name="age" />
               <set name="courses" table="tbl_student_course">
               <key column="s_id">
               </key>
               <many-to-many class="Course" column="c_id"></many-to-many>
              </set>
         </class>
    
      </hibernate-mapping>
    
  • 在上面的配置檔案中出現了一個table="tab_student_course"這樣的標籤,那麼這個是什麼呢?

在資料庫中如果兩個不同的實體出現了多對多的關係我們要給其中新增一個關係的對應表,我們稱之為橋表,那麼這裡的table="tab_student_course"就是學生表和課程對應的橋表

相關文章