逍遥居

学无止境

导航

NHibernate 配置文件的处理和使用多数据库的多层架构思路(第二部分)

二、数据访问层
这里演示了一个 一对多的例子:
两个表:事件表和日志表,事件表 (1: n) 日志表.
以下是两个实体类和对应的配置文件。我单独建了一个项目来存放它们,它们不算是数据访问层!数据访问层、业务逻辑层、显示层都要用它。

 

//-----------------------------------------------------------------------------------------
// 模块编号:030101
// 文件名: EventTypeInfo.cs
// 描述: EventTypeInfo 实体类
// 作者:ChenJie 
// 编写日期:2007-4-27
// Copyright 2007
//-----------------------------------------------------------------------------------------
using System;
using System.Collections;

namespace Novelty.Model.LogRecordBlcok
{
    
/// <summary>
    
/// <para>EventTypeInfo 类</para>
    
/// <para>操作事件类型</para>
    
/// <para><see cref="member"/></para>
    
/// <remarks></remarks>
    
/// </summary>

    public class EventTypeInfo : IComparable
    
{
        
内部成员变量

        
构造函数

        
属性

        
重载方法
    }

}


//-----------------------------------------------------------------------------------------
// 模块编号:
// 文件名: SystemLogInfo.cs
// 描述: SystemLogInfo 实体类
// 作者:ChenJie 
// 编写日期:2007-5-11
// Copyright 2007
//-----------------------------------------------------------------------------------------
using System;
using Novelty.Model.UserAccountBlcok;

namespace Novelty.Model.LogRecordBlcok
{
    
/// <summary>
    
/// <para>SystemLogInfo 类</para>
    
/// <para>操作日志表</para>
    
/// <para><see cref="member"/></para>
    
/// <remarks></remarks>
    
/// </summary>

    public class SystemLogInfo : IComparable
    
{
        
内部成员变量

        
构造函数

        
属性

        
重载方法
    }

}

EventTypeInfo.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    
<class name="Novelty.Model.LogRecordBlcok.EventTypeInfo, Novelty.Model" table="EventType">
        
<id name="EventId" column="EventId" type="Int32" unsaved-value="null">
            
<generator class="assigned" />
        
</id>
        
<property name="EventParentId" type="Int32">
            
<column name="EventParentId" length="4" sql-type="int" not-null="true"/>
        
</property>
        
<property name="EventName" type="string">
            
<column name="EventName" length="32" sql-type="nvarchar" not-null="true"/>
        
</property>
        
<property name="Description" type="string">
            
<column name="Description" length="128" sql-type="nvarchar" not-null="false"/>
        
</property>
        
<bag name="SystemLogs" inverse="true" lazy="true" cascade="all-delete-orphan">
            
<key column="EventId"/>
            
<one-to-many class="Novelty.Model.LogRecordBlcok.SystemLogInfo, Novelty.Model"/>
        
</bag>
    
</class>
</hibernate-mapping>

SystemLogInfo.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    
<class name="Novelty.Model.LogRecordBlcok.SystemLogInfo, Novelty.Model" table="SystemLog">
        
<id name="SystemLogId" column="SystemLogId" type="Int32" unsaved-value="null">
            
<generator class="assigned" />
        
</id>
        
<property name="OperationTime" type="DateTime">
            
<column name="OperationTime" length="8" sql-type="datetime" not-null="true"/>
        
</property>
        
<property name="Description" type="string">
            
<column name="Description" length="128" sql-type="nvarchar" not-null="true"/>
        
</property>
        
<property name="IPAddress" type="string">
            
<column name="IPAddress" length="15" sql-type="nvarchar" not-null="false"/>
        
</property>        
        
<property name="UserSerial" type="Decimal">
            
<column name="UserSerial" length="5" sql-type="decimal" not-null="true"/>
        
</property>        
        
<many-to-one name="EventType" class="Novelty.Model.LogRecordBlcok.EventTypeInfo, Novelty.Model">
            
<column name="EventId" length="4" sql-type="int" not-null="true" index="OperationEvent_FK"/>
        
</many-to-one>        
    
</class>
</hibernate-mapping>

        上面的代码太长了,你省略它们也不太影响思路。(为什么不早说?:) )

        我们就举一个数据层访问类,它是操作 SystemLog 表的!

        关于下面的代码,我就解释一下 Insert  方法,它是整个数据层中思路最重要的部分!
        由于EventTypeInfo 和 SystemLogInfo 和 是一对多的关系!所以我们在插入 SystemLogInfo 对象前,先创建EventTypeInfo 对象:
        先获得EventTypeInfo 的实体通用操作对象:
EntityControl<EventTypeInfo> eventTypeEntityControl = CommonDatabaseOperation<EventTypeInfo>.Instance.GetEntityControl(DEFAULT_DATABASE_IDENTIFIER);
        然后通过EventTypeInfo 的实体通用操作对象来获得EventTypeInfo 对象:
EventTypeInfo eventType = eventTypeEntityControl.GetEntity(eventId);
        在这里我们就不需要强制转换对象了,因为使用了范型类!当然,这里还不足以体现它的优越性!
        由于我们声明了全局变量:
private readonly EntityControl<SystemLogInfo> entityControl;
        然后在构造函数中创建它:
entityControl = CommonDatabaseOperation<SystemLogInfo>.Instance.GetEntityControl("SystemDatabase");
        然后在该类的各个方法中都可以使用属于SystemLogInfo 的实体通用操作对象,其中在获得对象或是对象列表时均不需要强制转换对象。
        这个数据访问层类只写了对应实体通用操作类中的一些方法,还应该包含其他方法!文件中没有给出例子,但是我还是举两个例说一下。
        (1)比如批量删除记录,怎么办?听说NH的作者说要么不用NH,要么用SQL!已经用NH,那就只有SQL来进行批量删除记录。(可能是执行SQL 的代码太简单,或者担心破坏面向对象操作的思想,或者其他,我不知道!)但是我们来进行处理SQL,特别是带条件的SQL。因为条件各不相同,所以为什么我不把执行SQL的操作方法抽象出来放在实体通用操作类中,而是在各自需要的数据访问层类写各自的。
我在底层的SessionFactory类中放了一个方法:
public Configuration GetConfiguration(string assemblyName, string nhibernateConfigName, string connectionString);
 
        通过它可以获得 ISessionFactoryImplementor 类的对象,然后再获得连接 IDbConnection 接口对象,然后再获得cmd,将相应的参数值赋上,然后再进行 SQL 操作。
        具体参考底层的 EntityControl 类中方法:
public IList<T> GetEntitiesByExecuteSQL(string sql)
        它给出了执行 SQL 语句的思路。

        (2)多条件查询!
        这个就是完全和 NH相关,还是因为条件各不相同,我无法在实体通用操作类中完成!
        这个可以参考底层的 EntityControl 类中方法:
public IList<T> GetEntities(string propertyName, object value)
        还补充一类情况:
string hql = "FROM SystemLogInfo WHERE UserSerial = :UserSerial ";
IQuery q = session.CreateQuery(hql);
q.SetDemical("UserSerial ", userSerial );
q.SetMaxResults(number);
return q.List();
        这个例子中的session底层的SessionFactory类的方法
public ISession OpenSession(string assemblyName, string nhibernateConfigName, string connectionString)
 中获得。
        这类查询还有很多,这里只是简单举例,目的在于说明数据访问层里面究竟包含一些什么东西。
        《面向对象的NHibernate数据查询语言-HQL》这篇文章关于查询讲的非常好,可供我们好好学习!

//-----------------------------------------------------------------------------------------
// 模块编号:
// 文件名: SystemLog.cs
// 描述: SystemLog 数据层访问类
// 作者:ChenJie 
// 编写日期:2007-5-11
// Copyright 2007
//-----------------------------------------------------------------------------------------
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using Novelty.Model.LogRecordBlcok;
using Novelty.CustomSystem;
using Novelty.CustomSystem.NHibernateOperation;
using Novelty.CustomSystem.NHibernateOperation.NHibernateModule;

namespace Novelty.CustomSystem.LogStrategy.LogRecordBlcok
{
    
/// <summary>
    
/// SystemLog表的数据层访问类
    
/// </summary>

    internal class SystemLog
    
{
        
常量

        
私有变量

        
构造函数

        
接口
    }

}

 

NHibernate 配置文件的处理和使用多数据库的多层架构思路(第一部分)
http://www.cnblogs.com/scucj/archive/2007/05/15/747688.html
NHibernate 配置文件的处理和使用多数据库的多层架构思路(第三部分)
http://www.cnblogs.com/scucj/archive/2007/05/15/747698.html

posted on 2007-05-15 20:51  逍遥剑客  阅读(2738)  评论(1编辑  收藏  举报