Blog信息 |
blog名称: 日志总数:1304 评论数量:2242 留言数量:5 访问次数:7592281 建立时间:2006年5月29日 |

| |
[Hibernate]hibernate继承之---subclass 已更新(四) 软件技术
lhwork 发表于 2007/1/7 14:06:52 |
先看由满江红翻译团队(RedSaga Translate Team)翻译的子类(subclass)说明,再来看我们的例子多态持久化需要为父类的每个子类都进行定义。对于“每一棵类继承树对应一个表”的策略来说,就需要使用<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>好了。。开始看例子了。。建表500)this.width=500'>create table animal500)this.width=500'>(aid varchar(32) not null primary key,500)this.width=500'> atype varchar(16),500)this.width=500'> dname varchar(16),500)this.width=500'> cname varchar(16)500)this.width=500'>)父类500)this.width=500'>package com.test;500)this.width=500'>500)this.width=500'>public class Animal500)this.width=500'>500)this.width=500'>500)this.width=500'>{500)this.width=500'> private String aid;500)this.width=500'> //geter seterCat500)this.width=500'>package com.test;500)this.width=500'>500)this.width=500'>public class Cat extends Animal500)this.width=500'>500)this.width=500'>500)this.width=500'>{500)this.width=500'> private String cname;500)this.width=500'> //geter seterDog
500)this.width=500'>package com.test;500)this.width=500'>500)this.width=500'>public class Dog extends Animal500)this.width=500'>500)this.width=500'>500)this.width=500'>{500)this.width=500'> private String dname;500)this.width=500'> //geter seter配置文件。。精华在这了.500)this.width=500'><?xml version="1.0"?>500)this.width=500'><!DOCTYPE hibernate-mapping500)this.width=500'> PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"500)this.width=500'> "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">500)this.width=500'>500)this.width=500'><hibernate-mapping>500)this.width=500'>500)this.width=500'> <class name="com.test.Animal" table="animal"> 500)this.width=500'>500)this.width=500'> <id name="aid" type="string" unsaved-value="null" >500)this.width=500'> <column name="aid" sql-type="char(32)" not-null="true"/>500)this.width=500'> <generator class="uuid.hex"/>500)this.width=500'> </id>500)this.width=500'>500)this.width=500'> <discriminator column="atype" type="string" />500)this.width=500'> 500)this.width=500'> <subclass name="com.test.Dog" discriminator-value="dog">500)this.width=500'> <property name="dname">500)this.width=500'> <column name="dname" sql-type="varchar(16)" />500)this.width=500'> </property>500)this.width=500'> </subclass>500)this.width=500'>500)this.width=500'> <subclass name="com.test.Cat" discriminator-value="cat">500)this.width=500'> <property name="cname">500)this.width=500'> <column name="cname" sql-type="varchar(16)"/>500)this.width=500'> </property>500)this.width=500'> </subclass>500)this.width=500'>500)this.width=500'> </class>500)this.width=500'>500)this.width=500'></hibernate-mapping>测试类500)this.width=500'>package com.test;500)this.width=500'>500)this.width=500'>import net.sf.hibernate.Session;500)this.width=500'>import net.sf.hibernate.SessionFactory;500)this.width=500'>import net.sf.hibernate.cfg.Configuration;500)this.width=500'>import net.sf.hibernate.*;500)this.width=500'>import java.sql.*;500)this.width=500'>import java.util.List;500)this.width=500'>import java.util.Iterator;500)this.width=500'>500)this.width=500'>public class TestInherit500)this.width=500'>500)this.width=500'>500)this.width=500'>{500)this.width=500'> SessionFactory sf;500)this.width=500'> Session session;500)this.width=500'> public TestInherit()500)this.width=500'>500)this.width=500'> 500)this.width=500'>{500)this.width=500'> try500)this.width=500'>500)this.width=500'> 500)this.width=500'>{500)this.width=500'> Configuration cfg = new Configuration();500)this.width=500'> sf = cfg.addClass(Animal.class).buildSessionFactory();500)this.width=500'> }500)this.width=500'> catch(HibernateException ex)500)this.width=500'>500)this.width=500'> 500)this.width=500'>{500)this.width=500'> ex.printStackTrace();500)this.width=500'> }500)this.width=500'> }500)this.width=500'> //插入500)this.width=500'> public void doCreate()500)this.width=500'>500)this.width=500'> 500)this.width=500'>{500)this.width=500'> try500)this.width=500'>500)this.width=500'> 500)this.width=500'>{500)this.width=500'> session = sf.openSession();500)this.width=500'>500)this.width=500'> Dog dog = new Dog();500)this.width=500'> dog.setDname("small dog");500)this.width=500'> Cat cat = new Cat();500)this.width=500'> cat.setCname("small cat");500)this.width=500'> session.save(dog);500)this.width=500'> session.save(cat);500)this.width=500'> session.flush();500)this.width=500'> session.connection().commit();500)this.width=500'>500)this.width=500'> }500)this.width=500'> catch(HibernateException ex)500)this.width=500'>500)this.width=500'> 500)this.width=500'>{500)this.width=500'> ex.printStackTrace();500)this.width=500'> }500)this.width=500'> catch(SQLException ex1)500)this.width=500'>500)this.width=500'> 500)this.width=500'>{500)this.width=500'> ex1.printStackTrace();500)this.width=500'> }500)this.width=500'> finally500)this.width=500'>500)this.width=500'> 500)this.width=500'>{500)this.width=500'>500)this.width=500'> try500)this.width=500'>{500)this.width=500'> session.close();500)this.width=500'> }500)this.width=500'>500)this.width=500'> catch(HibernateException ex2)500)this.width=500'>{500)this.width=500'> }500)this.width=500'> }500)this.width=500'>500)this.width=500'> }500)this.width=500'> //查询500)this.width=500'> public void doQuery()500)this.width=500'>500)this.width=500'> 500)this.width=500'>{500)this.width=500'>500)this.width=500'> try500)this.width=500'>{500)this.width=500'> session = sf.openSession();500)this.width=500'> Query q = session.createQuery("select d from Dog as d");500)this.width=500'> List l = q.list();500)this.width=500'> Dog dog = null;500)this.width=500'> Cat cat = null;500)this.width=500'> for(int i=0;i<l.size();i++)500)this.width=500'>500)this.width=500'> 500)this.width=500'>{500)this.width=500'> dog = (Dog)l.get(i);500)this.width=500'> System.out.println(dog.getDname());500)this.width=500'> }500)this.width=500'> }500)this.width=500'>500)this.width=500'> catch(HibernateException ex)500)this.width=500'>{500)this.width=500'> ex.printStackTrace();500)this.width=500'> }500)this.width=500'>500)this.width=500'> finally500)this.width=500'>{500)this.width=500'>500)this.width=500'> try500)this.width=500'>{500)this.width=500'> session.close();500)this.width=500'> }500)this.width=500'>500)this.width=500'> catch(HibernateException ex2)500)this.width=500'>{500)this.width=500'> }500)this.width=500'> }500)this.width=500'> }500)this.width=500'> public static void main(String[] args)500)this.width=500'>500)this.width=500'> 500)this.width=500'>{500)this.width=500'> TestInherit t = new TestInherit();500)this.width=500'> //t.doCreate();500)this.width=500'> t.doQuery();500)this.width=500'> }500)this.width=500'>}500)this.width=500'> |
|
|