什么叫subclass?举个例子,用户有一般用户与管理用户。她们都记录在用户表中,通过一个字段来标识是一般用户还是管理用户。我们继续这个例子。

用一个表Users保存一般用户与管理员信息,标识的字段是一个字符型,名为UserKind,值为user的是一般用户,值为admin为管理员;看一下

代码

 映射文件如何写,其实很简单
Users.hbm.xml

实现继承--映射中的Subclass<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
实现继承--映射中的Subclass  
<class name="MyEntity.Users,MyEntity" table="Users">
实现继承--映射中的Subclass    
<id name="ID" type="Int32">
实现继承--映射中的Subclass      
<generator class="native" />
实现继承--映射中的Subclass    
</id>
实现继承--映射中的Subclass    
<discriminator column="UserKind" type="String" />
实现继承--映射中的Subclass    
<property name="Name" type="String" not-null="true" length="50" />    
实现继承--映射中的Subclass    
实现继承--映射中的Subclass     
<subclass name="MyEntity.Admin,MyEntity" discriminator-value="User">        
实现继承--映射中的Subclass    
</subclass>
实现继承--映射中的Subclass     
<subclass name="MyEntity.Admin,MyEntity" discriminator-value="Admin">        
实现继承--映射中的Subclass    
</subclass>
实现继承--映射中的Subclass  
</class>
实现继承--映射中的Subclass
</hibernate-mapping>

 

需要注意的只是discriminator与discriminator-value.

输出数据结构

实现继承--映射中的SubclassConfiguration cfg = new Configuration();
实现继承--映射中的Subclasscfg.AddClass(
typeof(Users));
实现继承--映射中的Subclass
new SchemaExport (cfg).Create(true,true);
实现继承--映射中的Subclass
User与Admin都不需要加到Configuration中,加的话只会引起错误。

持久化对象

实现继承--映射中的SubclassConfiguration cfg = new Configuration();
实现继承--映射中的Subclasscfg.AddClass(
typeof(Users));
实现继承--映射中的Subclass_sessions 
= cfg.BuildSessionFactory();
实现继承--映射中的SubclassUser usr 
= new User();
实现继承--映射中的Subclassusr.Name 
= "一般用户";
实现继承--映射中的SubclassAdmin ad 
= new Admin();
实现继承--映射中的Subclassad.Name 
= "管理员";
实现继承--映射中的SubclassISession session 
= this._sessions.OpenSession();
实现继承--映射中的Subclasssession.Save(usr);
实现继承--映射中的Subclasssession.Save(ad);
实现继承--映射中的Subclass
实现继承--映射中的Subclass

执行结果

实现继承--映射中的SubclassNHibernate: INSERT INTO Users (Name, UserKind) VALUES (@p0, 'User'); select SCOPE_IDENTITY()
实现继承--映射中的Subclass@p0 = '一般用户'
实现继承--映射中的SubclassNHibernate: INSERT INTO Users (Name, UserKind) VALUES (@p0, 'Admin'); select SCOPE_IDENTITY()
实现继承--映射中的Subclass@p0 = '管理员'

检索

实现继承--映射中的SubclassISession session = this._sessions.OpenSession();
实现继承--映射中的Subclass
int iID = 1;
实现继承--映射中的Subclass
int iID2 = 2;
实现继承--映射中的Subclass
object obj = session.Load(typeof(Users),iID);
实现继承--映射中的Subclass
object obj2 = session.Load(typeof(Users),iID2);
实现继承--映射中的Subclass
实现继承--映射中的Subclass
string str1 = "User";
实现继承--映射中的Subclass
string str2 = "User";
实现继承--映射中的Subclass
if(obj is Admin)
实现继承--映射中的Subclass    str1 
= "Admin";
实现继承--映射中的Subclass
if(obj2 is Admin)
实现继承--映射中的Subclass    str2 
= "Admin";
实现继承--映射中的SubclassConsole.WriteLine(
"obj1 is " + str1);
实现继承--映射中的SubclassConsole.WriteLine(
"obj2 is " + str2);
实现继承--映射中的Subclass

结果
obj1 is User
obj2 is Admin.

直接查询一般用户
实现继承--映射中的SubclassISession session = this._sessions.OpenSession();
实现继承--映射中的Subclass
int iID = 1;
实现继承--映射中的SubclassUser usr 
= (User)session.Load(typeof(User),iID);
实现继承--映射中的Subclasssession.Close();
实现继承--映射中的Subclass

查询过程
实现继承--映射中的SubclassNHibernate: SELECT user0_.ID as ID0_, user0_.NickName as NickName0_, user0_.Name as Name0_ FROM Users user0_ WHERE user0_.ID=@p0 and user0_.UserKind='User'
实现继承--映射中的Subclass@p0 = '1'

相关文章: