NHibernate Cookbook 学习笔记 2 Creating class hierarchy mappings
来源:互联网 发布:新华三大数据招聘 编辑:程序博客网 时间:2024/06/09 18:58
这一节来看看在NH中是怎么样来表示继承体系的
先来定义2个类,第一个是Book类,继承自product类:
namespace NStudy.core { public class Book : Product { public virtual string ISBN { get; set; } public virtual string Author { get; set; } }}
第2个是Movie类,继承自product类:
namespace NStudy.core { public class Product :Entity{ public virtual string Name { get; set; } public virtual string Description { get; set; } public virtual decimal UnitPrice { get; set; } }}
1.第一种方式是,所有的继承体系都体现在一张数据库表中,比如下面的这张 表
配置方式如下:
Product.hbm.xml:
<?xml version="1.0" encoding="utf-8" ?><hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NStudy.core" namespace="NStudy.core"> <class name="Product"> <id name="Id"> <generator class="guid.comb" /> </id> <discriminator column="ProductType" /> <natural-id mutable="true"> <property name="Name" not-null="true" /> </natural-id> <property name="Description" /> <property name="UnitPrice" not-null="true" /> </class></hibernate-mapping>
注意
<discriminator column="ProductType" />
<natural-id mutable="true">
<property name="Name" not-null="true" />
</natural-id>
这2行的作用discriminator 用来区分此条数据记录的类型,通常存的数据为NStudy.core.Product,这样的全称,<natural-id mutable="true">是指定一个自然键,同时这个支持修改的自然键。
Book.hbm.xml:
<?xml version="1.0" encoding="utf-8" ?><hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NStudy.core" namespace="NStudy.core"> <subclass name="Book" extends="Product"> <property name="Author"/> <property name="ISBN"/> </subclass></hibernate-mapping>
Movie.hbm.xml:
<?xml version="1.0" encoding="utf-8" ?><hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NStudy.core" namespace="NStudy.core"> <subclass name="Movie" extends="Product"> <property name="Director" /> </subclass></hibernate-mapping>
注意像下面这样的写法,就映射成上面的那张数据表:
<subclass name="Book" extends="Product">
<property name="Author"/>
<property name="ISBN"/>
</subclass>
值得注意的是,这种方式,一定要注意某些值不能设置为空:比如Author,ISBN,因为在Movie中没有这样的字段,所以不能设置为不允许空,因为它本来就是空。
2.上面这种方式,个人觉得不太好,下面这种会好一点:
稍稍修改一下配置文件,如下面所示:
Movie.hbm.xml:
<?xml version="1.0" encoding="utf-8" ?><hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NStudy.core" namespace="NStudy.core"> <joined-subclass name="Movie" extends="Product"> <key column="Id" /> <property name="Director" /> </joined-subclass></hibernate-mapping>
注意变化: <joined-subclass name="Movie" extends="Product">,这样NH做查询Product的时候,使用的join查询
3.还有最后一种方式,如下:
配置文件如下:
<?xml version="1.0" encoding="utf-8" ?><hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NStudy.core" namespace="NStudy.core"> <union-subclass name="Movie" extends="Product"> <property name="Director" /> </union-subclass></hibernate-mapping>
这样如果NH查找product数据,则会用unions的方法来查询。
- NHibernate Cookbook 学习笔记 2 Creating class hierarchy mappings
- NHibernate Cookbook 学习笔记 1 Mapping a class with XML
- NHibernate Cookbook 学习笔记 5
- NHibernate Cookbook 学习笔记 6
- NHibernate Cookbook 学习笔记 4 Setting up a base entity class
- 《iOS5 programming cookbook》学习笔记2
- python技巧(2):--python cookbook学习笔记
- cookbook学习笔记一
- Sql cookbook学习笔记
- Sql cookbook学习笔记
- 《Apache Cookbook》学习笔记
- R COOKBOOK 学习笔记
- opencv3 cookbook 学习笔记
- TensorFlow cookbook学习笔记
- CREATING VIEWMODEL TO VIEW MAPPINGS
- Hibernate 学习笔记(五)-- 实体层设计之Table per class hierarchy
- Nhibernate 学习笔记(1)
- NHibernate学习笔记
- Struts2中的零配置与CoC(Convention over Configration)约定优于配置
- 收入-进账,计算
- 有关操作系统(c语言 || 汇编)
- Git-Getting start
- 设计模式的使用场景和原因和产生的效果
- NHibernate Cookbook 学习笔记 2 Creating class hierarchy mappings
- java常见异常
- JAR文件包及jar命令详解
- C# 错误问题积累
- Linux环境下创建静态库和动态库
- CSS设置DIV Herf底层图片和链接同时改变,兼容IE,Firefox,Opera,Safari,Chrome等
- 自己动手重新实现LINQ to Objects: 7 - Count和LongCount
- Linux下如何用GCC编译动态库
- Android开发环境搭建