NHibernate 2.0 参考文档 - 03 配置
由于NHibernate是为了能在各种不同环境下工作而设计的, 因此存在着大量的配置参数.
幸运的是多数配置参数都 有比较直观的默认值, 并有随Hibernate一同分发的配置样例 App.config(位于src\NHibernate.Test)来展示各种配置选项.
所需做的仅仅是将这个样例文件复制到自己的项目路径下并做一些自定义的修改.
一个NHibernate.Cfg.Configuration实例代表了一个应用程序中.NET类型 到SQL数据库映射的完整集合.
Configuration被用来构建一个(不可变的 (immutable)) ISessionFactory. 映射定义则由不同的XML映射定义文件编译而来。
你可以直接实例化Configuration来获取一个实例, 下面是一个例子如何加载两个xml映射文件。
1 Configuration cfg = new Configuration() 2 .AddFile("Item.hbm.xml") 3 .AddFile("Bid.hbm.xml");
另一个方法(有时候可能会更好),让NHibernate从嵌入式资源里面加载映射文件:
1 Configuration cfg = new Configuration() 2 .AddClass(typeof(NHibernate.Auction.Item)) 3 .AddClass(typeof(NHibernate.Auction.Bid));
NHibernate将会在当前应用程序集中中寻找名字为NHibernate.Auction.Item.hbm.xml和 NHibernate.Auction.Bid.hbm.xml嵌入式资源文件. 这种方式消除了任何对文件名的硬编码(hardcoded).
还有一种方法(应该是最好的),让NHibernate自动到程序集加载所有的嵌入式资源xml映射文件。
1 Configuration cfg = new Configuration() 2 .AddAssembly( "NHibernate.Auction" );
NHibernate会自动到应用程序集里查找所有的以.hbm.xml结尾的资源文件。这种方式消除了任何对文件名的硬编码(hardcoded), 并且确保了应用程序集里的所有的xml映射文件都被加载。
如果使用Visual Studio .NET 和 NAnt 来编译应用程序集的话,请确保.hbm.xml文件被作为嵌入式资源编译进应用程序集。
Configuration也允许你指定配置属性:
1 IDictionary<string, string> props = new Dictionary<string, string>(); 2 ... 3 Configuration cfg = new Configuration() 4 .AddClass(typeof(NHibernate.Auction.Item)) 5 .AddClass(typeof(NHibernate.Auction.Bind)) 6 .SetProperties(props);
Configuration实例被设计成启动期间(configuration-time)对象, 一旦ISessionFactory创建完成它就被丢弃了。
当所有映射定义被Configuration解析后, 应用程序必须获得一个用于构造ISession实例的工厂。 这个工厂将被应用程序的所有线程共享:
1 ISessionFactory sessions = cfg.BuildSessionFactory();
NHibernate允许你的应用程序创建多个ISessionFactory实例。这对使用多个数据库的应用来说很有用。
ISessionFactory可以通过用户自己创建的ADO.NET连接创建一个ISession, 这样的设计可以让你让你们的程序更方便的获取数据库连接:
1 IDbConnection conn = myApp.GetOpenConnection(); 2 ISession session = sessions.OpenSession(conn); 3 4 // do some data access work
注意不要用同一个ADO.NET打开两个不同的ISession!
另一种方法就是,你可以让ISessionFactory替你打开连接。ISessionFactory必须事先知道ADO.NET连接的参数,有几种不同的方法设置参数:
-
通过提供一个IDictionary实例给Configuration.SetProperties()。
-
在名为nhibernate的System.Configuration.NameValueSectionHandler类型的配置节点添加属性。
-
在应用程序的配置文件中的配置节里包含 <property>元素,配置节命名为 hibernate-configuration,并且要被设置为使用NHibernate.Cfg.ConfigurationSectionHandler处理。 XML名称空间要被设置为urn:nhibernate-configuration-2.2。
-
在hibernate.cfg.xml 中包含 <property>元素(后面会继续讨论)。
如果你使用这种方法,打开一个ISession是非常简单的:
1 ISession session = sessions.OpenSession(); // open a new Session 2 // do some data access work, an ADO.NET connection will be used on demand
所有的NHibernate属性名和约束都在 NHibernate.Cfg.Environment类中定义。我们讨论一下ADO.NET连接配置最重要的几项设置:
假若你设置了如下的属性,NHibernate会使用ADO.NET Data Provider来得到连接:
表 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。 详细的dialect与IDriver的默认对应关系可以查看API文档。 |
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何时释放数据库连接。查看10.7 连接释放模式.
例如: auto (默认) | on_close | after_transaction 注意,这些设置仅对通过ISessionFactory.OpenSession得到的ISession起作用。对于通过ISessionFactory.GetCurrentSession得到的ISession, 所配置的ICurrentSessionContext实现控制这些ISession的连接释放模式。 请参阅2.3。上下文相关的(Contextual) Session获取更多信息。 |
command_timeout | 指定NHibernate生成的IDbCommands对象的超时时间。 . |
adonet.batch_size | 指定用ADO.Net的批量更新的数量,默认设置为0(不启用该功能)。请参阅16.6. 批量更新. |
下面是一个如何在web.config里如何设置数据库连接属性的例子:
1 <configuration> 2 <configSections> 3 <section name="hibernate-configuration" 4 type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" /> 5 </configSections> 6 7 <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 8 <session-factory> 9 <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider, NHibernate</property> 10 <property name="connection.connection_string"> 11 Server=127.0.0.1; Initial Catalog=thedatabase; Integrated Security=SSPI 12 </property> 13 <property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property> 14 <property name="current_session_context_class">managed_web</property> 15 </session-factory> 16 </hibernate-configuration> 17 <!-- other app specific config follows --> 18 19 </configuration>
NHibernate依赖的ADO.NET自己实现的数据库连接池。
你也可以通过实现NHibernate.Connection.IConnectionProvider接口来自己定义ADO.NET连接获取策略, 你也可以通过设置connection.provider_class来更换数据库连接获取策略。
有大量属性能用来控制NHibernate在运行期的行为. 它们都是可选的, 并拥有适当的默认值.
警告: 其中一些属性是"系统级(system-level)的",系统级属性只能通过在代码里设置NHibernate.Cfg.Environment类的静态属性,或者在配置文件里的<hibernate-configuration>配置节里来设置, 而不能用Configuration.SetProperties方法来设置。
表 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 |
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 |
你应当总是为你的数据库将hibernate.dialect属性设置成正确的 NHibernate.Dialect.Dialect子类.
不过这并不是要严格执行的除非你带算使用 native或者是sequence主键生成策略或者是悲观锁定 (例如使用ISession.Lock()或者是IQuery.SetLockMode()), 如果你指定一种方言, NHibernate将为上面列出的一些属性使用合理的默认值, 为你省去了手工指定它们的功夫.
表 3.3. NHibernate SQL 方言 (hibernate.dialect)
关系型数据库 | 方言 | 备注 |
---|---|---|
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 (any version) | NHibernate.Dialect.OracleDialect | |
Oracle 9/10g | NHibernate.Dialect.Oracle9Dialect | |
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 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 |
其他可用的方言都包含在NHibernate Contrib项目中,(请参阅《I. NHibernateContrib 参考文档》)。现在这个项目里仅仅包含Microsoft Access (Jet)数据库方言.
如果你的数据库支持ANSI, Oracle或Sybase风格的外连接, 外连接抓取通常能通过限制往返数据库次数 (更多的工作交由数据库自己来完成)来提高效率. 外连接抓取允许在单个SELECTSQL语句中, 通过many-to-one, one-to-many, many-to-many和one-to-one关联获取连接对象的整个对象图.
默认情况下,抓取在叶子对象,集合类,拥有代理的对象或者产生对自身的循环引用时终止。
对于部分关联(particular association),可以通过设置 fetch来配置(默认行为会被覆盖)。
将hibernate.max_fetch_depth设为0能在全局范围内禁止外连接抓取. 设为1 或更高值能启用one-to-one和many-to-oneouter关联的外连接抓取, 它们通过fetch="join"来映射.
具体信息请参阅《16.1. 抓取策略(Fetching strategies) 》
在NHibernate 1.0里,outer-join具备同样的功效,这个标签现在已经过期了,取而代之的是 fetch标签。
你可以通过实现NHibernate.Cache.ICacheProvider接口来集成一个使用进程或群集范围内的二级缓存系统。
你可以通过设置cache.provider_class来选择缓存的实现。 请参阅《16.2. 二级缓存(The Second Level Cache)》。
你可以使用hibernate.query.substitutions在NHibernate中定义新的查询符号. 例如:
1 query.substitutions true=1, false=0
将导致符号true和false在生成的SQL中被翻译成整数常量.
1 query.substitutions toLowercase=LOWER
将允许你重命名SQL中的LOWER函数.
NHibernate使用Apache log4net来为各种事件记录日志。
你可以从http://logging.apache.org/log4net/下载log4net。 你需要在应用程序配置文件添加一个log4net配置节用于配置log4net。
NHibernate的源代码分发包里有一个示例配置文件,位置在src/NHibernate.Test。
我们强烈建议你熟悉一下NHibernate的日志消息. 在不失可读性的前提下, 我们做了很多工作, 使NHibernate的日志可能地详细。
这是必要的查错利器。 当你遇到问题的时候不要忘了设置show_sql开启SQL日志。
NHibernate.Cfg.INamingStrategy接口允许你为数据库中的对象和schema 元素指定一个“命名标准”.
你可能会提供一些通过.NET标识生成数据库标识或将映射定义文件中"逻辑"表/列名处理成"物理"表/列名的规则.
这个特性有助于减少冗长的映射定义文件. (例如:TBL_ 前缀). NHibernate默认是最小化实现。
在加入映射定义前,你可以调用 Configuration.SetNamingStrategy()指定一个不同的命名策略:
1 ISessionFactory sf = new Configuration() 2 .SetNamingStrategy(ImprovedNamingStrategy.Instance) 3 .AddFile("Item.hbm.xml") 4 .AddFile("Bid.hbm.xml") 5 .BuildSessionFactory();
NHibernate.Cfg.ImprovedNamingStrategy是一个内建的命名策略, 对一些应用程序而言,可能是非常有用的起点.
另一个配置方法是在hibernate.cfg.xml文件中指定一套完整的配置. 这个文件可以当成配置文件中的 <nhibernate;>和<hibernate-configuration>配置节的替代。
XML配置文件默认放在应用程序的根目录下。下面是一个例子:
1 <?xml version=‘1.0‘ encoding=‘utf-8‘?>; 2 <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 3 <session-factory> 4 <!-- properties --> 5 <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> 6 <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> 7 <property name="connection.connection_string">Server=localhost;initial catalog=nhibernate;User Id=;Password=</property> 8 <property name="show_sql">false</property> 9 <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property> 10 <property name="use_outer_join">true</property> 11 12 <!-- mapping files --> 13 <mapping resource="NHibernate.Auction.Item.hbm.xml" assembly="NHibernate.Auction" /> 14 <mapping resource="NHibernate.Auction.Bid.hbm.xml" assembly="NHibernate.Auction" /> 15 </session-factory> 16 /hibernate-configuration>
使用XML配置,使得启动NHibernate变的异常简单, 如下所示,一行代码就可以搞定:
1 ISessionFactory sf = new Configuration().Configure().BuildSessionFactory();
1 ISessionFactory sf = new Configuration() 2 .Configure("/path/to/config.cfg.xml") 3 .BuildSessionFactory();
Q空间:http://778078163.qzone.qq.com
博客园:http://www.cnblogs.com/LonelyShadow
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。