程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 淺析Java的Hibernate框架中的繼續關系設計

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

編輯:關於JAVA

淺析Java的Hibernate框架中的繼續關系設計。本站提示廣大學習愛好者:(淺析Java的Hibernate框架中的繼續關系設計)文章只能為提供參考,不一定能成為您想要的結果。以下是淺析Java的Hibernate框架中的繼續關系設計正文


此次我們來講一下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> 

  很通俗的映照文件,跟之前的沒甚麼差別。
 上面我們直接寫一個測試辦法:

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類的子類,查出一切成果。這裡觸及到一個多態形式,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中指定。
 如許當我們運轉後生成的表就以下圖:

兩個子類對應的表只要我們經由過程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經由過程哪一個字段來停止差別。

<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有值。
 如許我們就只須要用到一個表,就注解了它們幾個類的關系了,留意,這類方法對有過量子類的情形下,其實不好,它會使主表的字段過量,會形成必定的設計上的未便。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved