NHibernate从入门到精通系列——NHibernate环境与结构体系
内容摘要
NHibernate的开发环境
NHibernate的结构体系
NHibernate的配置
一、NHibernate的开发环境
NHibernate的英文官方网站为:http://nhforge.org/
NHibernate目前最新的版本是3.0.0.GA,其下载地址是:http://sourceforge.net/projects/nhibernate/files/NHibernate/
我可以下载NHibernate-3.0.0.GA-bin.zip(编译后的dll),也可以下载 NHibernate-3.0.0.GA-src.zip(源文件),另外再下载NHCH-3.0.0.GA-bin.zip(NHibernate二级缓存库)。
图1.1
下载并解压NHibernate-3.0.0.GA-bin.zip后,如图1.1所示。
- 其中名为“Required_Bins”的文件夹所放置的是NHiberante主程序的dll程序集。
(1).Antlr3.Runtime.dll为:Antlr的程序集。Antlr(ANother Tool for Language Recognition)是一个工具,它为我们构造自己的识别器(recognizers)、编译器(compiler)和转换器(translators)提供了一个基础。通过定义自己的语言规则,Antlr可以为我们生成相应的语言解析器,这样便可以省却了自己全手工打造的劳苦。
(2).Iesi.Collections.dll为:NHibernate程序的集合库,因为在.NET4.0之前,没有提供ISet这样的集合,所以NHiberante框架的设计者们就将ISet这样的集合放置在这个程序集里。我建议NHiberante框架的设计人员,在.NET4.0以后的程序,使用System.Collections.Generic.ISet<T>这个接口。
(3).NHibernate.dll为主程序集
(4).Remotion.Data.Linq.dll为:NHibernate to Linq的类库。
(5).nhibernate-configuration.xsd和nhibernate-mapping.xsd分别为NHibernate程序配置和映射配置的xsd文件,我们把这个两个文件复制到Microsoft Visual Studio安装目录的\Xml\Schemas下,就会有xml的自动提示功能。
- 名为“Required_For_LazyLoading”的文件夹所放置的是NHiberante延迟加载代理用到的程序集,其中提供了Castle、LinFu、Spring这三种代理类。我选择其中一项就可以了。
- 名为“Configuration_Templates”的文件夹所放置的是NHiberante的配置模板。已给出了FireBird、MSSQL、MySql、Oracle、PostgreSQL、SQLite的配置模板。
二、NHiberante的结构体系(Architecture)
图2.1
从图2.1可以看出,NHibernate使用数据库和配置信息来为应用程序提供持久化服务(以及持久的对象)。
我们来更详细地看一下NHibernate运行时体系结构。由于NHibernate非常灵活,且支持多种应用方案, 所以我们这只描述一下两种极端的情况。“轻型”的体系结构方案,要求应用程序提供自己的ADO.NET 连接并管理自己的事务。这种方案使用了NHibernate API的最小子集:
图2.2
“全面解决”的体系结构方案,将应用层从底层的ADO.NET API中抽象出来,而让NHibernate来处理这些细节。
图2.3
图2.3中各个对象的定义如下:
ISessionFactory (NHibernate.ISessionFactory)
针对单个数据库映射关系经过编译后的内存镜像,是线程安全的(不可变)。 它是生成ISession的工厂,本身要用到IConnectionProvider。 该对象可以在进程或集群的级别上,为那些事务之间可以重用的数据提供可选的二级缓存。
ISession (NHibernate.ISession)表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期很短。 其隐藏了ADO.NET连接,也是 ITransaction的工厂。 其会持有一个针对持久化对象的必选(第一级)缓存, 在遍历对象图或者根据持久化标识查找对象时会用到。
持久的对象及其集合(Persistent Objects and Collections)带有持久化状态的、具有业务功能的单线程对象,此对象生存期很短。 这些对象可能是普通的POCOs, 唯一特殊的是他们正与(仅仅一个)ISession相关联。 一旦这个ISession被关闭, 这些对象就会脱离持久化状态,这样就可被应用程序的任何层自由使用。 (例如,用作跟表示层打交道的数据传输对象。)
瞬态(transient)和脱管(detached)的对象及其集合那些目前没有与ISession关联的持久化类实例。 他们可能是在被应用程序实例化后, 尚未进行持久化的对象。 也可能是因为实例化他们的ISession已经被关闭而脱离持久化的对象。
ITransaction (NHibernate.ITransaction)(可选的)应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短。 它通过抽象将应用从底层具体的ADO.NET事务隔离开。 某些情况下,一个ISession之内可能包含多个ITransaction对象。
IConnectionProvider (NHibernate.Connection.IConnectionProvider)(可选的)生成ADO.NET连接以及Command对象的工厂。 它通过抽象将应用从底层的IDbConnection或IDbCommand隔离开。 仅供开发者扩展/实现用,并不暴露给应用程序使用。
IDriver (NHibernate.Driver.IDriver)(可选的)一个封装了不同ADO.NET providers之间的差异(利用参数命名转换等ADO.NET支持的特性)的接口。
ITransactionFactory (NHibernate.Transaction.ITransactionFactory)(可选的)生成ITransaction对象实例的工厂。 仅供开发者扩展/实现用,并不暴露给应用程序使用。
三、NHibernate的配置
由于NHibernate是为了能在各种不同环境下工作而设计的, 因此存在着大量的配置参数. 幸运的是多数配置参数都有比较直观的默认值。我打开MSSQL.cfg文件,如图所示,可以观察到NHibernate的配置。
图3.1
3.1 NHibernate提供ADO.NET连接配置
属性名 |
用途 |
connection.provider_class |
实现IConnectionProvider接口的类型。 例如: (如果是NHibernate内部的IConnectionProvider实现类)full.classname.of.ConnectionProvider, (如果是自定义的NHibernate外部的IConnectionProvider实现类 )full.classname.of.ConnectionProvider, assembly。 |
connection.driver_class |
如果使用DriverConnectionProvider,实现IDriver接口的类型。 (如果是NHibernate内部的实现的IDriver类型)full.classname.of.Driver (如果是自定义的NHibernate外部的IDriver实现类 )full.classname.of.Driver, assembly。 这个配置通常是不需要配置的,如果设置好了hibernate.dialect一般会自动选好对应的IDriver。 |
connection.connection_string |
数据库连接字符串 |
connection.connection_string_name |
数据库连接字符串名称(定义在.Net配置文件<connectionStrings>配置节里面的连接字符串名。 |
connection.isolation |
ADO.NET事务隔离级别, 查看System.Data.IsolationLevel类来了解各个值的具体意义, 但请注意多数数据库都不支持所有的隔离级别。 例如: Chaos, ReadCommitted, ReadUncommitted, RepeatableRead, Serializable, Unspecified |
connection.release_mode |
指定ADO.NET何时释放数据库连接。 例如: auto (默认) | on_close | after_transaction 注意,这些设置仅对通过ISessionFactory.OpenSession得到的ISession起作用。 对于通过ISessionFactory.GetCurrentSession得到的ISession, 所配置的ICurrentSessionContext实现控制这些ISession的连接释放模式。 |
command_timeout |
指定NHibernate生成的IDbCommands对象的超时时间。 . |
adonet.batch_size |
指定用ADO.Net的批量更新的数量,默认设置为0(不启用该功能)。 |
proxyfactory.factory_class |
代理工厂配置。用于指定是哪个中间件提供的延迟加载代理 |
3.2 可选的配置属性
有大量属性能用来控制NHibernate在运行期的行为. 它们都是可选的, 并拥有适当的默认值。
属性名 |
用途 |
dialect |
设置NHibernate的Dialect类名 - 允许NHibernate针对特定的关系数据库生成优化的SQL 可用值: full.classname.of.Dialect, assembly |
default_schema |
在生成的SQL中, 将给定的schema/tablespace附加于非全限定名的表名上。 可用值: SCHEMA_NAME |
use_outer_join |
允许外连接抓取,已弃用,请使用max_fetch_depth。 可用值: true | false |
max_fetch_depth |
为单向关联(一对一, 多对一)的外连接抓取(outer join fetch)树设置最大深度。 值为0意味着将关闭默认的外连接抓取 可用值:建议在0 到3之间取值。 |
use_reflection_optimizer |
开启运行时代码动态生成来替代运行时反射机制(系统级属性)。 使用这种方式的话程序在启动会耗费一定的性能,但是在程序运行期性能会有更好的提升。 注意即使关闭这个优化, Hibernate还是需要CGLIB. 你不能在hibernate.cfg.xml中设置此属性。 这个属性不能在hibernate.cfg.xml或者是应用程序配置文件<hibernate-configuration> 配置节中设置。 可用值: true | false |
bytecode.provider |
指定字节码provider用于优化NHibernate反射性能。 null代表完全关闭性能优化, lcg用于轻量级的代码动态生成,codedom基于CodeDOM代码动态生成。 可用值: null | lcg | codedom |
cache.provider_class |
设置缓存实现类(实现ICacheProvider接口的类) 可用值: classname.of.CacheProvider, assembly |
cache.use_minimal_puts |
以频繁的读操作为代价, 优化二级缓存来最小化写操作(对群集缓存有效)。 可用值: true | false |
cache.use_query_cache |
允许查询缓存, 个别查询仍然需要被设置为可缓存的. 可用值: true | false |
cache.query_cache_factory |
自定义实现IQueryCacheFactory接口的类名, 默认为内建的StandardQueryCacheFactory。 可用值: classname.of.QueryCacheFactory, assembly |
cache.region_prefix |
二级缓存区域名的前缀。 可用值: prefix |
query.substitutions |
将NHibernate查询中的符号映射到SQL查询中的符号 (符号可能是函数名或常量名字)。 可用值: hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC query.substitutions true=1, false=0 将导致符号true和false在生成的SQL中被翻译成整数常量 |
show_sql |
输出所有SQL语句到控制台. 可用值: true | false |
hbm2ddl.auto |
在ISessionFactory创建时,自动检查数据库结构,或者将数据库schema的DDL导出到数据库。 使用 create-drop时,在显式关闭ISessionFactory时,将drop掉数据库schema。 可用值: create | create-drop |
use_proxy_validator |
是否启用验证接口或者是类是否可以使用代理,默认开启。 (检查实体类的属性或者是方法是否被设置为Virtual) 可用值: true | false |
transaction.factory_class |
自定义ITransactionFactory的实现,默认为NHibernate内建的AdoNetTransactionFactory。 可用值: classname.of.TransactionFactory, assembly |
关系型数据库 |
方言 |
备注 |
DB2 |
NHibernate.Dialect.DB2Dialect |
|
DB2 for iSeries (OS/400) |
NHibernate.Dialect.DB2400Dialect |
|
Ingres |
NHibernate.Dialect.IngresDialect |
|
PostgreSQL |
NHibernate.Dialect.PostgreSQLDialect |
|
PostgreSQL 8.1 |
NHibernate.Dialect.PostgreSQL81Dialect |
方言在PostgreSQL8.1中现在支持FOR UPDATE NOWAIT了。 |
PostgreSQL 8.2 |
NHibernate.Dialect.PostgreSQL82Dialect |
方言在PostgreSQL8.2中现在支持在 DROP TABLE和DROP SEQUENCE中使用IF EXISTS关键字了。 |
MySQL 3 or 4 |
NHibernate.Dialect.MySQLDialect |
|
MySQL 5 |
NHibernate.Dialect.MySQL5Dialect |
|
Oracle 8g |
NHibernate.Dialect.Oracle8iDialect |
|
Oracle 9g |
NHibernate.Dialect.Oracle9Dialect |
|
Oracle 10/11g |
NHibernate.Dialect.Oracle10gDialect |
|
Sybase Adaptive Server Enterprise |
NHibernate.Dialect.SybaseDialect |
|
Sybase Adaptive Server Anywhere |
NHibernate.Dialect.SybaseAnywhereDialect |
|
Microsoft SQL Server 2000 |
NHibernate.Dialect.MsSql2000Dialect |
|
Microsoft SQL Server 2005 |
NHibernate.Dialect.MsSql2005Dialect |
|
Microsoft SQL Server 2008 |
NHibernate.Dialect.MsSql2008Dialect |
|
Microsoft SQL Server 2005 Everywhere Edition |
NHibernate.Dialect.MsSqlCeDialect |
|
Microsoft SQL Server 7 |
NHibernate.Dialect.MsSql7Dialect |
|
Firebird |
NHibernate.Dialect.FirebirdDialect |
把driver_class设置为 NHibernate.Driver.FirebirdClientDriver启用Firebird provider for .NET 2.0。 |
SQLite |
NHibernate.Dialect.SQLiteDialect |
把driver_class设置为NHibernate.Driver.SQLite20Driver启用System.Data.SQLite provider for .NET 2.0。 |
Ingres 3.0 |
NHibernate.Dialect.IngresDialect |
|