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
实例二、类的继承、多态关系
在我们实际设计过程中,经常碰到类的继承关系,比如一个电子产品商店,同时销售手机和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
相关文章推荐
- Nhibernate+SQLite 入门实例指南一
- jQuery中文入门指南,翻译加实例,jQuery的起点教程
- Nhibernate系列学习之(一) ORM and Nhibernate入门实例解析
- 第十五讲:SQLite入门指南
- PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
- jQuery中文入门指南,翻译加实例,jQuery的起点教程
- jQuery中文入门指南,翻译加实例,jQuery的起点教程
- jQuery中文入门指南,翻译加实例,jQuery的起点教程
- java入门教程-4.8Java final关键字:阻止继承和多态
- Javascript 类/声明/继承/多态实例
- VBA类的继承多态实例
- 总结:C#语法——继承、虚拟、多态、实例化
- 实例讲解 封装继承多态(三)
- 《程序员的第一年》---------- 复习一下C#的【封装 多态 继承 -----简单计算器源码实例】
- Java继承关系中,父类方法使用实例变量和调用实例方法的探究
- jQuery中文入门指南,翻译加实例,jQuery的起点教程
- [扫盲]利用架构实例解析面向对象的封装,多态,继承,接口,泛型
- NHibernate 快速指南 实例
- jQuery中文入门指南,翻译加实例,jQuery的起点教程
- jQuery中文入门指南,翻译加实例,jQuery的起点教程