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