Nhibernate继承类的写法
继承有三种实现方法即 每个类一张表;每具体类一张表;所有类一张表。
每类一张表,采用连接的写法,所有类引用其父类,采用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
调用代码如下:
protected void Button3_Click(object sender, EventArgs e)
{
//------费用编号表---Begin-----
ExpenseBhb expensebhbTmp = new ExpenseBhb();
expensebhbTmp.Number = 1;
expensebhbTmp.Name = "营销费用";
BhbDetail bhbdetailTmp = new BhbDetail();
bhbdetailTmp.LastChangePerson = "juanWang";
bhbdetailTmp.Bhb = expensebhbTmp;
……
//------费用编号表---End--------
//------类型编号表--Begin-----
KindBhb kindbhb1 = new KindBhb();
kindbhb1.Number = 1;
kindbhb1.Name = "鸟类";
……
//------类型编号表--End-------
string sTmp = "Congratulate, We are succeed!";
ISession session = Sessions.GetSession();
ITransaction trans = session.BeginTransaction();
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;
}