最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析Java的Hibernate框架中的繼承關系設計

 更新時間:2015年12月28日 17:37:16   作者:cxshun  
這篇文章主要介紹了Java的Hibernate框架中的繼承關系設計,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下

這次我們來說一下hibernate的層次設計,層次設計也就是實體之間的繼承關系的設計。
 也許這樣比較抽象,我們直接看例子。
 1)我們先看一下普通的做法
 直接上代碼:三個實類如下:

public class TItem implements Serializable{ 
    //省略Get/Set方法 
  private int id; 
  private String manufacture; 
  private String name;   
} 
public class TBook extends TItem{ 
    //省略Get/Set方法 
  private int pageCount; 
   
} 
public class TDVD extends TItem{ 
    //省略Get/Set方法 
  private String regionCode; 
} 

 
  這里我們需要三個映射文件,內容如下:

<class name="TItem" table="ITEM"> 
    <id name="id" column="id" type="java.lang.Integer"> 
      <generator class="native" /> 
    </id> 
    <property name="name" column="name" type="java.lang.String"/> 
    <property name="manufacture" column="manufacture" type="java.lang.String"/> 
  </class> 
<class name="TBook" table="Book"> 
    <id name="id" column="id" type="java.lang.Integer"> 
      <generator class="native" /> 
    </id> 
    <property name="name" column="name" type="java.lang.String"/> 
    <property name="manufacture" column="manufacture" type="java.lang.String"/> 
    <property name="pageCount" column="pageCount" type="java.lang.Integer"/> 
  </class> 
<class name="TDVD" table="DVD"> 
    <id name="id" column="id" type="java.lang.Integer"> 
      <generator class="native" /> 
    </id> 
    <property name="name" column="name" type="java.lang.String"/> 
    <property name="manufacture" column="manufacture" type="java.lang.String"/> 
    <property name="regionCode" column="regionCode" type="java.lang.String"/> 
  </class> 

  很普通的映射文件,跟以前的沒什么區(qū)別。
 下面我們直接寫一個測試方法:

public void testSelect() { 
     
    Query query = session.createQuery("from TItem "); 
    List list = query.list(); 
    Iterator iter = list.iterator(); 
     
    while(iter.hasNext()) { 
      System.out.println("Name:"+(((TItem)iter.next()).getName())); 
    } 
     
  } 

  注意,這里我們是用TItem類,而不是具體的字類,這里它會自動去查找繼承于TItem類的子類,查出所有結果。這里涉及到一個多態(tài)模式,class標簽有屬性 polymorphism,它的默認值為implicit,這意味著不需要指定名稱就可以查詢出結果。如果為explicit則表明需要指定具體的類名時,才可以查出此類的結果。
 2)上個例子中我們用到了三個映射文件,當我們需要修改時,就需要修改三個映射文件,這對于大的項目是很不可行的。而且每個表都有對應的主類的對應字段,這是多余的。所以我們有下面這種方法。
 實體類還是跟1)中的一樣。我們把映射文件由三個改為一個,只保留TItem映射文件。但我們需要做相應的修改,現在內容如下:

<class name="TItem" table="ITEM" polymorphism="explicit"> 
    <id name="id" column="id" type="java.lang.Integer"> 
      <generator class="native" /> 
    </id> 
    <property name="name" column="name" type="java.lang.String"/> 
    <property name="manufacture" column="manufacture" type="java.lang.String"/> 
    <joined-subclass name="TBook" table="TBOOK"> 
      <key column="id" /> 
      <property name="pageCount" column="pageCount" type="java.lang.Integer" /> 
    </joined-subclass> 
    <joined-subclass name="TDVD" table="TDVD"> 
      <key column="id"/> 
      <property name="regionCode" column="regionCode" type="java.lang.String"/>  
    </joined-subclass> 
  </class> 

 
  這里,我們只有一個映射文件,但有一個joined-subclass標簽,它表明這個類繼承于當前類,<key>表明分表的主鍵,這里分表是指TBOOK和TDVD這兩個由子類對應的表。分表中只有字段在property中指定。
 這樣當我們運行后生成的表就如下圖:

20151228173509059.png (586×227)

兩個子類對應的表只有我們通過property指定的字段。這樣就避免了表內有多個字段,使字表只維護其單獨字段,當item類進行改變時,也不用過多的進行修改。

3)再來了解另外一種方法實現層次設計,這就是通過在表內置入標志來實現。在hibernate的映射文件中我們通過descriminator標簽來進行實現。
 廢話不多說,我們直接看例子:
 我們把昨天的TItem的映射文件修改為:

<class name="TItem" table="ITEM" polymorphism="explicit"> 
    <id name="id" column="id" type="java.lang.Integer"> 
      <generator class="native" /> 
    </id> 
     <discriminator column="category" type="java.lang.String"/> 
      
     <property name="name" column="name" type="java.lang.String"/> 
     <property name="manufacture" column="manufacture" type="java.lang.String"/>     
  </class> 

  看到中間,我們加入了一個discriminator標簽,它表明我們以下的兩個subclass通過哪個字段來進行區(qū)別。

<subclass name="TBook" discriminator-value="1"> 
    <property name="pageCount" column="pageCount"/> 
   </subclass> 
   <subclass name="TDVD" discriminator-value="2" > 
    <property name="regionCode" column="regionCode"/> 
   </subclass> 

  我們看到這兩段,它指明了當discriminator所指定的field的值為1時,表明它是TBook類,并且pageCount有值;當discriminator所指定的field值為2時,表明它是TDVD類,并且regionCode有值。
 這樣我們就只需要用到一個表,就表明了它們幾個類的關系了,注意,這種方式對有過多子類的情況下,并不好,它會使主表的字段過多,會造成一定的設計上的不便。

相關文章

  • SpringBoot整合Hbase的實現示例

    SpringBoot整合Hbase的實現示例

    這篇文章主要介紹了SpringBoot整合Hbase的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • logback的addtivity屬性定義源碼解讀

    logback的addtivity屬性定義源碼解讀

    這篇文章主要為大家介紹了logback的addtivity屬性定義源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • java.io.IOException:你的主機中的軟件中止了一個已建立的連接踩坑實戰(zhàn)

    java.io.IOException:你的主機中的軟件中止了一個已建立的連接踩坑實戰(zhàn)

    最近在工作中遇到了個問題,分享給同樣遇到問題的同學,這篇文章主要給大家介紹了關于java.io.IOException:你的主機中的軟件中止了一個已建立的連接的踩坑實戰(zhàn)記錄,需要的朋友可以參考下
    2023-03-03
  • Java結構型設計模式之組合模式Composite Pattern詳解

    Java結構型設計模式之組合模式Composite Pattern詳解

    組合模式,又叫部分整體模式,它創(chuàng)建了對象組的數據結構組合模式使得用戶對單個對象和組合對象的訪問具有一致性。本文將通過示例為大家詳細介紹一下組合模式,需要的可以參考一下
    2022-11-11
  • Springboot整合ActiveMQ實現消息隊列的過程淺析

    Springboot整合ActiveMQ實現消息隊列的過程淺析

    昨天仔細研究了activeMQ消息隊列,也遇到了些坑,下面這篇文章主要給大家介紹了關于SpringBoot整合ActiveMQ的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • Guava?Retryer實現接口重試的示例

    Guava?Retryer實現接口重試的示例

    本文主要介紹了Guava?Retryer實現接口重試的示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Java對象轉換的方案分享

    Java對象轉換的方案分享

    這篇文章主要介紹了Java對象轉換的方案分享,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-09-09
  • Java的Spring框架中DAO數據訪問對象的使用示例

    Java的Spring框架中DAO數據訪問對象的使用示例

    這篇文章主要介紹了Java的Spring框架中DAO數據訪問對象的使用示例,分為在Spring中DOA與JDBC以及與Hibernate的配合使用兩種情況來進行演示,需要的朋友可以參考下
    2016-03-03
  • Mybatis常用注解中的SQL注入實例詳解

    Mybatis常用注解中的SQL注入實例詳解

    MyBatis是一款優(yōu)秀的持久層框架,它支持定制化 SQL(靈活)、存儲過程(PLSQL模塊化的組件,數據庫的一部分)以及高級映射(表映射為Bean也可以將Bean映射為表),下面這篇文章主要給大家介紹了關于Mybatis常用注解中的SQL注入的相關資料,需要的朋友可以參考下
    2022-02-02
  • Java如何跳出當前多重循環(huán)你知道嗎

    Java如何跳出當前多重循環(huán)你知道嗎

    這篇文章主要為大家介紹了Java跳出當前多重循環(huán),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01

最新評論

庆元县| 广南县| 阳高县| 葫芦岛市| 绥宁县| 湄潭县| 丘北县| 常熟市| 罗山县| 柳州市| 星子县| 冷水江市| 乌拉特中旗| 茌平县| 崇明县| 精河县| 微博| 沛县| 合肥市| 西和县| 古蔺县| 南乐县| 雅江县| 山阳县| 德格县| 南安市| 遂川县| 金堂县| 钟山县| 招远市| 青冈县| 凉城县| 仁寿县| 鹤山市| 岢岚县| 藁城市| 花垣县| 平和县| 阿坝| 本溪市| 屏东县|