JAVA高級(jí)編程之hibernate框架學(xué)習(xí)二

hibernate映射關(guān)系

映射關(guān)系相關(guān)屬性詳解

  • name:屬性的名字,同時(shí)是對(duì)用類的屬性名字。

  • table:創(chuàng)建后的表名

  • class (可選 - 默認(rèn)是通過(guò)反射得到的屬性類型):被關(guān)聯(lián)的類的名字。

  • column:主鍵對(duì)應(yīng)的屬性名,key標(biāo)簽的colum表示外鍵

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

    常見主鍵生成方式

    1.increment:主鍵遞增生成,其生成方式與底層數(shù)據(jù)庫(kù)無(wú)關(guān),大部分?jǐn)?shù)據(jù)庫(kù)都支持,該方式的實(shí)現(xiàn)機(jī)制是在當(dāng)前應(yīng)用實(shí)例中維持一個(gè)變量,以保存著當(dāng)前的最大值,之后每次需要生成主鍵的時(shí)候?qū)⒋酥导?作為轉(zhuǎn)。其不足之處是當(dāng)多個(gè)線程并發(fā)對(duì)數(shù)據(jù)庫(kù)表進(jìn)行寫操作時(shí),可能出現(xiàn)相同的主鍵值,發(fā)生主鍵重復(fù)的沖突,所以在多線程并發(fā)操作的時(shí)候不應(yīng)該使用該方法。

     <generator class="increment" />
    

    2.identity:與底層數(shù)據(jù)庫(kù)有關(guān),要求數(shù)據(jù)庫(kù)支持Identity,如MySQL中auto_increment,SQL Server中的identity。支持的數(shù)據(jù)庫(kù)有MySQL,SQL Server,DB2,Sybase,但是不支持oracle.支持并發(fā)。

    <generator class="identity" />
    

    3.assigned:主鍵由外部程序負(fù)責(zé)生成,無(wú)需Hibernate參與。----如果要由程序代碼來(lái)指定主鍵,就采有這種。

    <generator class="assigned" />
    

    4.sequence:使用序列生成主鍵,需要底層數(shù)據(jù)庫(kù)支持

    在數(shù)據(jù)庫(kù)中建一個(gè)序列
    
        create sequence seq_name increment by 1 start with 1;
        在映射文件中指定使用序列的名字
        <generator class="sequence">
        <param name="sequence">seq_name</param>
       </generator>
    
  • property:普通屬性的標(biāo)簽

  • constrained(約束) (可選):表明該類對(duì)應(yīng)的表對(duì)應(yīng)的數(shù)據(jù)庫(kù)表,和被關(guān)聯(lián)的對(duì)象所對(duì)應(yīng)的數(shù)據(jù)庫(kù)表之間,通過(guò)一個(gè)外鍵引用對(duì)主鍵進(jìn)行約束。
    這個(gè)選項(xiàng)影響save()和delete()在級(jí)聯(lián)執(zhí)行時(shí)的先后順序

  • unique:是在使用hibernate的自動(dòng)建表的時(shí)候才用到,uniq="true"用來(lái)指定表中的外鍵唯一,即給表中的外鍵添加唯一性約束,保證是一對(duì)一的關(guān)系。

  • property-ref:用來(lái)指定關(guān)聯(lián)類的屬性名,這個(gè)屬性將會(huì)和本類中的主鍵相對(duì)應(yīng),如果沒有指定,默認(rèn)使用關(guān)聯(lián)類的主鍵和本類中的主鍵相對(duì)應(yīng)。

  • lazy:true/false,session是否延遲查詢所需要的對(duì)象的相關(guān)屬性

  • cascade(級(jí)聯(lián)) (可選):表明操作是否從父對(duì)象級(jí)聯(lián)到被關(guān)聯(lián)的對(duì)象。

    級(jí)聯(lián)的類型

    lazy="none":在保存,更新,刪除當(dāng)前對(duì)象的時(shí)候忽略其他關(guān)聯(lián)的對(duì)象。是cascade的默認(rèn)值

    lazy="save-update":當(dāng)通過(guò)Session的save(),update(),saveOrUpdate()方法來(lái)保存或者更新當(dāng)前對(duì)象的時(shí)候級(jí)聯(lián)保存所有關(guān)聯(lián)的臨時(shí)對(duì)象,級(jí)聯(lián)更新所有關(guān)聯(lián)的游離對(duì)象。

    lazy="delete":當(dāng)通過(guò)Session的delete()方法刪除當(dāng)前對(duì)象的時(shí)候級(jí)聯(lián)刪除所有關(guān)聯(lián)的對(duì)象。

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

    lazy="delete-orphan":刪除所有和當(dāng)前對(duì)象解除關(guān)聯(lián)關(guān)系的對(duì)象。(只能在set中配置)

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

  • inverse:負(fù)責(zé)控制關(guān)系,inverse真正的作用是指定由哪一方來(lái)維護(hù)之間的關(guān)聯(lián)關(guān)系,當(dāng)一方指定inverse="false"那么這一方就有責(zé)任負(fù)責(zé)之間的關(guān)聯(lián)關(guān)系。.需要將其中的一方inverse="true",默認(rèn)為false,只能顯示在<set>放進(jìn)行設(shè)置。

映射關(guān)系類型

  • 一對(duì)一
    一個(gè)人對(duì)應(yīng)一張身份證,一張身份證對(duì)應(yīng)一個(gè)人
    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" />
                    <!-- 在主方配置一對(duì)一 -->
                   <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>
  • 一對(duì)多
    一位顧客對(duì)應(yīng)多個(gè)訂單,多個(gè)訂單對(duì)應(yīng)一位顧客
    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"/>
      
            <!-- 關(guān)聯(lián)映射 -->
            <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"/>
                <!-- 關(guān)聯(lián)映射 -->
               <many-to-one name="customer" class="Customer"
               column="c_id" />
         </class>
      </hibernate-mapping>
    
  • 多對(duì)多
    多個(gè)學(xué)生對(duì)應(yīng)多門課程,多門課程對(duì)應(yīng)對(duì)個(gè)學(xué)生
    由于student和course都是多對(duì)多所以配置信息一樣:
    配置文件信息:

      <?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>
    
  • 在上面的配置文件中出現(xiàn)了一個(gè)table="tab_student_course"這樣的標(biāo)簽,那么這個(gè)是什么呢?

在數(shù)據(jù)庫(kù)中如果兩個(gè)不同的實(shí)體出現(xiàn)了多對(duì)多的關(guān)系我們要給其中添加一個(gè)關(guān)系的對(duì)應(yīng)表,我們稱之為橋表,那么這里的table="tab_student_course"就是學(xué)生表和課程對(duì)應(yīng)的橋表

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容