欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析Java的Hibernate框架中的繼承關(guān)系設(shè)計

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

這次我們來說一下hibernate的層次設(shè)計,層次設(shè)計也就是實體之間的繼承關(guān)系的設(shè)計。
 也許這樣比較抽象,我們直接看例子。
 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; 
} 

 
  這里我們需要三個映射文件,內(nèi)容如下:

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

<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標(biāo)簽,它表明這個類繼承于當(dāng)前類,<key>表明分表的主鍵,這里分表是指TBOOK和TDVD這兩個由子類對應(yīng)的表。分表中只有字段在property中指定。
 這樣當(dāng)我們運(yùn)行后生成的表就如下圖:

20151228173509059.png (586×227)

兩個子類對應(yīng)的表只有我們通過property指定的字段。這樣就避免了表內(nèi)有多個字段,使字表只維護(hù)其單獨(dú)字段,當(dāng)item類進(jìn)行改變時,也不用過多的進(jìn)行修改。

3)再來了解另外一種方法實現(xiàn)層次設(shè)計,這就是通過在表內(nèi)置入標(biāo)志來實現(xiàn)。在hibernate的映射文件中我們通過descriminator標(biāo)簽來進(jìn)行實現(xiàn)。
 廢話不多說,我們直接看例子:
 我們把昨天的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標(biāo)簽,它表明我們以下的兩個subclass通過哪個字段來進(jìn)行區(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> 

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

相關(guān)文章

  • java多線程編程技術(shù)詳解和實例代碼

    java多線程編程技術(shù)詳解和實例代碼

    這篇文章主要介紹了 java多線程編程技術(shù)詳解和實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • springboot跨域問題解決方案

    springboot跨域問題解決方案

    這篇文章主要介紹了springboot跨域問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • 深入理解Java設(shè)計模式之原型模式

    深入理解Java設(shè)計模式之原型模式

    這篇文章主要介紹了JAVA設(shè)計模式之原型模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2021-11-11
  • Mybatis查詢數(shù)據(jù)的項目實現(xiàn)

    Mybatis查詢數(shù)據(jù)的項目實現(xiàn)

    MyBatis通過XML配置文件或注解,把Java對象映射到對應(yīng)的數(shù)據(jù)庫表中,實現(xiàn)對象關(guān)系和數(shù)據(jù)關(guān)系的互相轉(zhuǎn)換,從而使得Java應(yīng)用程序能夠更簡單的操作和讀取數(shù)據(jù)庫,本文就詳細(xì)的介紹一下如何實現(xiàn),感興趣的可以了解一下
    2023-09-09
  • 淺談SpringBoot如何自定義Starters

    淺談SpringBoot如何自定義Starters

    今天帶大家來學(xué)習(xí)SpringBoot如何自定義Starters,文中有非常詳細(xì)的圖文介紹及代碼示例,對正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • 跟我學(xué)Java Swing之游戲設(shè)計(2)

    跟我學(xué)Java Swing之游戲設(shè)計(2)

    跟我學(xué)Java Swing之游戲設(shè)計(2)...
    2006-12-12
  • springboot基于keytool實現(xiàn)https的雙向認(rèn)證示例教程

    springboot基于keytool實現(xiàn)https的雙向認(rèn)證示例教程

    這篇文章主要介紹了springboot基于keytool實現(xiàn)https的雙向認(rèn)證,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • 詳解java的四舍五入與保留位示例

    詳解java的四舍五入與保留位示例

    本篇文章主要介紹了java的四舍五入與保留位示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • SpringBoot自定義監(jiān)聽器的項目實踐

    SpringBoot自定義監(jiān)聽器的項目實踐

    Spring Boot提供了強(qiáng)大的事件模型,其中包括多種內(nèi)置監(jiān)聽器,同時也支持開發(fā)者自定義監(jiān)聽器,下面就來介紹下SpringBoot自定義監(jiān)聽器,感興趣的可以了解一下
    2024-03-03
  • 如何基于SpringBoot實現(xiàn)人臉識別功能

    如何基于SpringBoot實現(xiàn)人臉識別功能

    人工智能時代的到來,相信大家已耳濡目染,虹軟免費(fèi),離線開放的人臉識別SDK,正推動著全行業(yè)進(jìn)入刷臉時代,下面這篇文章主要給大家介紹了關(guān)于如何基于SpringBoot實現(xiàn)人臉識別功能的相關(guān)資料,需要的朋友可以參考下
    2022-05-05

最新評論