hibernate繼承之---subclass 已更新(四)
先看由滿江紅翻譯團隊(RedSaga Translate Team)翻譯的子類(subclass)說明,再來看我們的例子
多態持久化需要為父類的每個子類都進行定義。對于“每一棵類繼承樹對應一個表”的策略來說,就需要使用<subclass>定義。
好了。。
開始看例子了。。
建表
create?table?animal
(aid?varchar(32)?not?null?primary?key,
?atype?varchar(16),
?dname?varchar(16),
?cname?varchar(16)
)
父類
package?com.test;

public?class?Animal


{
????private?String?aid;
???//geter?seterCat
package?com.test;

public?class?Cat?extends?Animal


{
????private?String?cname;
??//geter?seter
Dog
package?com.test;

public?class?Dog?extends?Animal


{
????private?String?dname;
???//geter?seter
配置文件。。精華在這了.
<?xml?version="1.0"?>
<!DOCTYPE?hibernate-mapping
????PUBLIC?"-//Hibernate/Hibernate?Mapping?DTD//EN"
????"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>

????<class?name="com.test.Animal"?table="animal">??

????????<id?name="aid"?type="string"?unsaved-value="null"?>
????????????<column?name="aid"?sql-type="char(32)"?not-null="true"/>
????????????<generator?class="uuid.hex"/>
????????</id>

????????<discriminator?column="atype"?type="string"?/>
????????
????????<subclass?name="com.test.Dog"?discriminator-value="dog">
????????????<property?name="dname">
????????????????<column?name="dname"?sql-type="varchar(16)"?/>
????????????</property>
????????</subclass>

????????<subclass?name="com.test.Cat"?discriminator-value="cat">
????????????<property?name="cname">
????????????????<column?name="cname"?sql-type="varchar(16)"/>
????????????</property>
????????</subclass>

????</class>

</hibernate-mapping>
測試類
package?com.test;

import?net.sf.hibernate.Session;
import?net.sf.hibernate.SessionFactory;
import?net.sf.hibernate.cfg.Configuration;
import?net.sf.hibernate.*;
import?java.sql.*;
import?java.util.List;
import?java.util.Iterator;

public?class?TestInherit


{
????SessionFactory?sf;
????Session?session;
????public?TestInherit()

????
{
????????try

????????
{
????????????Configuration?cfg?=?new?Configuration();
????????????sf?=?cfg.addClass(Animal.class).buildSessionFactory();
????????}
????????catch(HibernateException?ex)

????????
{
????????????ex.printStackTrace();
????????}
????}
????//插入
????public?void?doCreate()

????
{
????????try

????????
{
????????????session?=?sf.openSession();

????????????Dog?dog?=?new?Dog();
????????????dog.setDname("small?dog");
????????????Cat?cat?=?new?Cat();
????????????cat.setCname("small?cat");
????????????session.save(dog);
????????????session.save(cat);
????????????session.flush();
????????????session.connection().commit();

????????}
????????catch(HibernateException?ex)

????????
{
????????????ex.printStackTrace();
????????}
????????catch(SQLException?ex1)

????????
{
????????????ex1.printStackTrace();
????????}
????????finally

????????
{

????????????????try
{
????????????????????session.close();
????????????????}

????????????????catch(HibernateException?ex2)
{
????????????????}
????????}

????}
????//查詢
????public?void?doQuery()

????
{

????????try
{
????????????session?=?sf.openSession();
????????????Query?q?=?session.createQuery("select?d?from?Dog?as?d");
????????????List?l?=?q.list();
????????????Dog?dog?=?null;
????????????Cat?cat?=?null;
????????????for(int?i=0;i<l.size();i++)

????????????
{
????????????????dog?=?(Dog)l.get(i);
????????????????System.out.println(dog.getDname());
????????????}
????????}

????????catch(HibernateException?ex)
{
????????????ex.printStackTrace();
????????}

????????finally
{

????????????try
{
????????????????session.close();
????????????}

????????????catch(HibernateException?ex2)
{
????????????}
????????}
????}
????public?static?void?main(String[]?args)

????
{
????????TestInherit?t?=?new?TestInherit();
????????//t.doCreate();
????????t.doQuery();
????}
}

多態持久化需要為父類的每個子類都進行定義。對于“每一棵類繼承樹對應一個表”的策略來說,就需要使用<subclass>定義。
<subclass name="ClassName" (1) discriminator-value="discriminator_value" (2) proxy="ProxyInterface" (3) lazy="true|false" (4) dynamic-update="true|false" dynamic-insert="true|false" entity-name="EntityName" node="element-name"> <property .... /> ..... </subclass>
(1) | name: 子類的全限定名。 |
(2) | discriminator-value(辨別標志) (可選 - 默認為類名):一個用于區分每個獨立的子類的值。 |
(3) | proxy(代理) (可選): 指定一個類或者接口,在延遲裝載時作為代理使用。 |
(4) | lazy (可選, 默認是true): 設置為 lazy="false" 禁止使用延遲抓取 |
每個子類都應該定義它自己的持久化屬性和子類。 <version> 和<id> 屬性可以從根父類繼承下來。在一棵繼承樹上的每個子類都必須定義一個唯一的discriminator-value。如果沒有指定,就會使用Java類的全限定名。
可以在單獨的映射文件中,直接在hibernate-mapping下定義subclass,union-subclass和joined-subclass映射。這樣你只要增加一個新的映射文件就可以繼承一棵類繼承樹。你必須在子類的映射中指定extends 屬性來指定已映射的超類。注意:以前,這個特性使得映射文件的順序變得很重要。從Hibernate3開始,當使用extends關鍵字的時候,映射文件的次序便不重要了。而在單一映射文件中,依舊需要保持將超類定義在子類之前這樣的次序。
<hibernate-mapping> <subclass name="DomesticCat" extends="Cat" discriminator-value="D"> <property name="name" type="string"/> </subclass> </hibernate-mapping>
好了。。
開始看例子了。。
建表






父類
















Dog








配置文件。。精華在這了.































測試類





































































































































posted on 2006-04-09 00:18 record java and net 閱讀(2247) 評論(1) 編輯 收藏 所屬分類: java