继承有三种实现方法即 每个类一张表;每具体类一张表;所有类一张表。

每类一张表,采用连接的写法,所有类引用其父类,采用One2One/Many2One方法引用.

每个具体类一张表,其实就是单表的写法。

所有类一张表,写法如下。

试验环境:Bhb为主类, ExpenseBhb、KindBhb为子类。在数据库中就是通过Kind列来区分的。本示例中,子类未增加任何属性或行为。

其实可以这样理解,以前我一直考虑的编号表该如何处理的问题。

所有类保存在一张表中,则所有类的信息存储在一个Hbm.xml中

Hbm.xml
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">

 
  <class name="NHibernateStudy.Domain.Bhb, NHibernateStudy.Domain" table="TBL_BHB"
     lazy="false">
    <id name="Id" column="ID" type="Guid"
        unsaved-value="00000000-0000-0000-0000-000000000000">
      <generator class="guid" />
    </id>
    <discriminator column="KIND" type="String" length="50"/>
……
    <subclass name="NHibernateStudy.Domain.ExpenseBhb, NHibernateStudy.Domain" discriminator-value="费用"></subclass> 
    <subclass name="NHibernateStudy.Domain.KindBhb, NHibernateStudy.Domain" discriminator-value="类别"></subclass> 
  </class>

 
</hibernate-mapping>


 

注意其中两点是:

1) discriminator标志出表中是哪个列区分子类的

2) subclass中的discriminator-value,标志出该子类在表中存储在“区分列”中的值


 

.cs

ExpenseBhb、KindBhb要继承Bhb


 

编译错误

对于这种所有类放在一张表中的,需要将其公开属性设置为Virtual


 

调用代码如下:

protectedvoid Button3_Click(object sender, EventArgs
    {
//------费用编号表---Begin-----
ExpenseBhb expensebhbTmp = new ExpenseBhb();
        expensebhbTmp.Number = 1;

"营销费用";


 

BhbDetail bhbdetailTmp = new BhbDetail();
"juanWang";
        bhbdetailTmp.Bhb = expensebhbTmp;

 
……
//------费用编号表---End--------

 
//------类型编号表--Begin-----
KindBhb kindbhb1 = new KindBhb();
        kindbhb1.Number = 1;
"鸟类";
……
//------类型编号表--End-------

 
string sTmp = "Congratulate, We are succeed!";
ISession session = Sessions.GetSession();
ITransaction

 
try
        {
            session.Save(bhbdetailTmp);
            session.Save(bhbdetailTmp1);
            session.Save(kindbhb1);
            session.Save(kindbhb2);
            trans.Commit();
        }
catch
        {
            
            trans.Rollback();
            sTmp = "Sorry, Please try again!";        }
finally
        {
            session.Close();
        }

 
this.TbxHello.Text = sTmp;
        
    }