这一节来看看在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的方法来查询。