这两个小节主要是讲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是单例的。
其实应该还有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的包装类。
配置hibernate.cfg.xml
这个文件如下所示:见过很多次了。
几个主要参数的说明,这几个都是必填的。
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属性谁记得住呀。如下:
二、App.config configuration file using <nhibernate-configuration>
这种方式和使用hibernate.cfg.xml方式差不多,只不过是在App.Config中增加了一个叫做"hiberante-configuration"的节点。这个挺不爽的,前面的叫做nhibernate,这个叫做hibernate,为啥都不叫做nhibernate?
这种方式是作者强烈推荐的。看起来比较清爽,而且也有提示。
然后就可以使用下面的代码初始化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。之前看的时候一周怎么也能看一两张,如果要做笔记的时候,就每周只能做一两节的学习笔记。