您的位置:首页 > 数据库

Nhibernate+SQLite 入门实例指南二 类的继承、多态关系

2006-09-24 20:09 501 查看
昨天忘记向源代码下载了,现在补上第一章的代码:http://files.cnblogs.com/9527/QuickStart1.rar

实例二、类的继承、多态关系
在我们实际设计过程中,经常碰到类的继承关系,比如一个电子产品商店,同时销售手机和MP3,所以在设计系统的时候我们把手机和MP3的共性如品牌、名称等抽象为一个类,而把它们的特性比如MP3有内存容量,手机有号码等,我们以不同的子类来体现。如下图:
<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">

<class name="QuickStart2.Data.MobilePhone, QuickStart2.Data" table="t_mobilephone" >

<id name="Id" column="id" type="Int32">

<generator class="identity" />

</id>

<property name="Name" type="String(100)" column="name" />

<property name="Brand" type="String(20)" column="brand" />

<property name="Phonenumber" type="String(13)" column="phonenumber" />

</class>

</hibernate-mapping>

Mp3Player.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">

<class name="QuickStart2.Data.Mp3Player, QuickStart2.Data" table="t_mp3player" >

<id name="Id" column="id" type="Int32">

<generator class="identity" />

</id>

<property name="Name" type="String(100)" column="name" />

<property name="Brand" type="String(20)" column="brand" />

<property name="Mensize" type="Int32" column="mensize" />

</class>

</hibernate-mapping>

可以看到这两个映射和普通的映射文件没有什么不同。我们编写了一个段测试代码:

ISession session=null;

ArrayList list=null;

运行结果如下图所示:
<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">

<class name="QuickStart2.Data.electronic, QuickStart2.Data" table="t_electronic">

<id name="Id" column="id" type="Int32">

<generator class="identity" />

</id>

<property name="Name" type="String(100)" column="name" />

<property name="Brand" type="String(20)" column="brand" />

<joined-subclass name="QuickStart2.Data.MobilePhone,QuickStart2.Data" table="t_mobile">

<key column="id" />

<property name="Phonenumber" type="String(13)" column="phonenumber" />

</joined-subclass>

<joined-subclass name="QuickStart2.Data.Mp3Player,QuickStart2.Data" table="t_mp3">

<key column="id" />

<property name="Mensize" type="Int32" column="mensize" />

</joined-subclass>

</class>

</hibernate-mapping>

通过映射文件我们可以看到,我们为主类建立了映射,两个子类在<joined-subclass>节点下进行了配置。
我们现编写一段数据插入代码来看看,NHibernate是怎么进行数据插入的

public static void SaveMobilephone()

编译运行如上代码,在返回中我们看到如下结果
<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">

<class name="QuickStart2.Data.electronic, QuickStart2.Data" table="t_elec">

<id name="Id" column="id" type="Int32">

<generator class="identity" />

</id>

<discriminator column="category" type="String(10)" />

<property name="Name" type="String(100)" column="name" />

<property name="Brand" type="String(20)" column="brand" />

<subclass name="QuickStart2.Data.MobilePhone,QuickStart2.Data" discriminator-value="1" >

<property name="Phonenumber" type="String(13)" column="phonenumber" />

</subclass>

<subclass name="QuickStart2.Data.Mp3Player,QuickStart2.Data" discriminator-value="2" >

<property name="Mensize" type="Int32" column="mensize" />

</subclass>

</class>

</hibernate-mapping>

于前一节中的映射文件不一样的是,我们在映射文件中加入了一个识别器(discriminator),用来指定数据库中哪个字段是用来做为标识的。
在定义的子类的时候,也不能用joined-subclass 而要改成subclass joined-subclass不能支持discriminator-value属性,discriminator-value就是用来区分独立的子类当我们完成数据库的插入操作后(具体代码可以用上一节所提供的代码,由于代码完全相同,所以不再次提供了)我们可以看到,NHibernate只用了两次插入动作就完成了对数据的插入。
我们再运行查询的代码也可以用一条简单的SQL语句来完成操作,大家也可以试着用
list=(ArrayList)session.CreateQuery("from Mp3player").List();

list=(ArrayList)session.CreateQuery("from MobilePhone").List();
进行查询,在NHibernate生的结果如下图:



可以看到,NHibernate在读取数据的时候会自动更据标识读取Mp3Player或MobilePhone的内容。
但是这种方法也有它的硬伤,如果子类的特性太多,哪数据库的可读性就大打折扣了,甚至可以让人抓狂,对于系统的后期维护升级非常的不利。
因此、三种方法各有各的优点也各有缺点,我们要在设计的过程中更据实际情况进于权衡,然后才确定采用何种方式。
第二章代码下载:http://files.cnblogs.com/9527/QuickStart2.rar
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: