NHibernate In action ch2.3, ch2.4

这两个小节主要是讲Configuration的。

Basic Configuration

NH一般在两层或者多层的客户服务器Application中部署在服务器端。一般来说,客户端应用程序多是Web Browser,Widows Client不是很常见。

一般来说我们通过一个Configuration实例来获取一个ISessionFactory实例来开始基于NH的应用程序。

2.3.1 Creating a SessionFactory

这里是通过Configuration实例来创建ISessionFactory的,Configuration实例的作用类似于配置好工厂正常运行所需要的机器设备原料等。通过Configuration创建SessionFactory的过程如下:

1. 创建Configuration实例。

2. 通过Configuration实例加载hibernate.cfg,xml 和 *.hbm.xml 。这里主要的作用是配置好数据库连接和OR Mapping的信息。这一部应该是相当重要的。

3. 创建SessionFactory 实例。 释放Configuration实例。

作者举了一个实例。SessionFactory是单例的。

clip_image002

其实应该还有cfg.AddAssembly()方式来进行配置。 

 

作者提到Method Chain。略。。

按照惯例, NH 的XML Mapping Files 一般使用.hbm.xml 的扩展后缀。通常是一个Class 一个Mapping File

Working with mapping files

方式一: AddXMLFile()

NH 文档强烈建议Mapping File 应当和对应的类放到同一个目录下。这样的话,结合前面的惯例,基本上Mapping File的文件名也就可以确定了: Class Name + ".hbm.xml"。而作者说这种方式便于通过调用 AddXmlFile()来添加Mapping Files.

留个疑问:

(一)如果通过AddXMLFile方式来调用的话,这时候XML需要定义为嵌入资源么?如果一个程序集或者多个程序集具有很多Mapping Files,这时候每个Mapping Files都单独调用一次么? 另外SessionFactory一旦获取后,是否还可以继续AddXMLFile()?
方式二: AddClass()

这种方式是针对Embed XML Mapping Files inside .net Assemblies(嵌入资源)的。

调用方式多数如下:

ISessionFactory sessionFactory = new Configuration()

.Configure()

.AddClass(typeof(Model.Itme))

.AddClass(typeOf(Model.User))

.BuildSessionFactory();

采用AddXMLFile的时候虽然是推荐使用ClassName + ".hbm.xml"来命名Mapping File, 但是不强制。这种方式就是强制了。
第三种方式: AddAssembly() 或者 HbmSerializer.Serialize()

这种方式适用于加载一个程序集中的所有Mapped Class。

示例如下:

ISessionFactory sessionFactory = new Configuration()

.Configure()

.AddInputStream(//.net attributes

HbmSerializer.Default.Serialize(typeof(Model.Item).Assembly)

)

.AddAssembly(typeof(Model.Item).Assembly) //XML

.BuildSessioinFactory()

其实这种方式默认应该是嵌入资源方式了。

回归一下,对于配置的加载来说,NH存在加载XML和加载Class两种方式,也提供了一次加载一个Assembly的便利方法。

留个疑问:

1. 如何不通过制定具体的类名或者XML文件或者程序集来加载一个Application中的所有Mapping Files?

2. 一次加载还是需要时加载比较好?

Multiple Database And Session Factories

     每个SessionFactory只能对应一个Database

Configuration Techniques

这里主要是指对NH的Configure。比如数据库连接和NH运行时的一些参数等。

也存在三种方式:

第一: 通过Configuration.SetProperty()来处理。

第二:通过app.config 或者 web.config来处理。

第三: 通过hibernate.cfg.xml文件来配置。

对于第三种情况来说,配置文件也不是必须命名为hibernate.cfg.xml,但是如果不是这样的话就需要在Configuration.configurate()传入配置文件名。

2.3.2 Configuring the ADO.net database access

使用NH连接数据库的示意图如下, NH这时候有点像是对ADO的包装类。

clip_image004

配置hibernate.cfg.xml

这个文件如下所示:见过很多次了。

clip_image006

几个主要参数的说明,这几个都是必填的。

Connection.provider: 实现IConnectionProvider Interface的Class。

Dialect:方言。和具体的数据库产品对应。NH针对这个有优化。

Connection.driver_class: 实现ADO.net Driver的Class。

Connection.connection_string 连接字符串。
Starting NHibernate

步骤:

1. 下载安装 Database's Data Provide。

2. Log4net.dll添加到Project引用中。 推荐。

3. 配置NH的必须的 database-access properties

4. Configuration 加载配置。

5. 调用Configuration的Configure()方法,加载Mapping Files, 创建ISessionFactory。

6. 关闭ISessioinFactory。这个之前一直忘记做了。

2.4 Advanced Configuration

    基本的配置在前面已经说过了,更加详细的关于NH的或者其他优化的需要参考参考文档。作者额外强调了参数show_sql 设置为True

2.4.1 Using the application configuration file

     除了在hibernate.cfg.xml中对NH进行配置外,还可以在App.config中进行配置。在2.1节做Hello NH的例子的时候就已经了解到了,应该是在Console Application中必须使用app.config吧。另外作者提到很多人喜欢在App.config中进行配置的好处之一就是将所有的配置都集中化了,比如说Log4net的配置也可以仍在这里(窃以为还是单个文件比较好,如果都扔到这里, 看起来多头大)。 

在App.config中进行NH的配置存在两种方式:

一、App.config configuration file using <nhibernate>

这种方式的特点是在Section中使用的Name是"nhibernate",在配置的时候使用的是key - value的格式。很明显这种方式很不方便,容易笔误。在网上的配置大多数都是这个样子,莫非这个是1.2的配置?另外说实话在Section中的publickeyToken属性谁记得住呀。如下:

clip_image008

二、App.config configuration file using <nhibernate-configuration>

这种方式和使用hibernate.cfg.xml方式差不多,只不过是在App.Config中增加了一个叫做"hiberante-configuration"的节点。这个挺不爽的,前面的叫做nhibernate,这个叫做hibernate,为啥都不叫做nhibernate?

这种方式是作者强烈推荐的。看起来比较清爽,而且也有提示。

clip_image010

然后就可以使用下面的代码初始化NHibernate。

ISessionFactory sessionFactory = new Configuration()

.Configure()

.BuildSessionFactory();

 

上面的代码中是没有明确指明配置文件名的,而我们存在两种配置文件,所有NH存在一个默认的加载配置顺序:

当调用Configure()的时候,NH首先在Application Configuration file中进行搜索查找,然后在一个叫做hibernate.cfg.xml中查找。如果使用不同的文件名,那么可以在Configure()中指定。

ISessionFactory sessionFactory = new Configuration()

.Configuration("NHibernate.config")

.BuildSessionFactroy();

2.4.2 Logging

    作者提到这一样的一句话“An INSERT statement isn’t usually executed when the application calls ISession.Save(); “这个在HelloNHibernate中就已经验证过了,貌似这种说法是不对的,不知道是不是我的环境或者配置的问题。 

    由于NH使用Log4net作为log utils, 那么可以配置log4net来对NH内部的调用或者实现看的比较清楚,十分利于调试。 

    配置log4net略。内事不觉问百度,外事不决问Google。 

Ch2 is over。之前看的时候一周怎么也能看一两张,如果要做笔记的时候,就每周只能做一两节的学习笔记。

转载于:https://www.cnblogs.com/jiva/archive/2009/12/14/1623389.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值