体系结构
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对象实例的工厂。 仅供开发者扩展/实现用,并不暴露给应用程序使用。
实例状态
一个持久化类的实例可能处于三种不同状态中的某一种。 这三种状态的定义则与所谓的持久化上下文(persistence context)有关。 NHibernate的ISession对象就是这个所谓的持久化上下文:
瞬态(transient)
该实例从未与任何持久化上下文关联过。它没有持久化标识(相当于主键值)。
持久化(persistent)
实例目前与某个持久化上下文有关联。 它拥有持久化标识(相当于主键值),并且可能在数据库中有一个对应的行。 对于某一个特定的持久化上下文,NHibernate保证持久化标识与CLR标识(其值代表对象在内存中的位置)等价。
脱管(detached)
实例曾经与某个持久化上下文发生过关联,不过那个上下文被关闭了, 或者这个实例是被序列化(serialize)到另外的进程。 它拥有持久化标识,并且在数据库中可能存在一个对应的行。 对于脱管状态的实例,NHibernate不保证任何持久化标识和CLR标识的关系。
配置
一个NHibernate.Cfg.Configuration实例代表了一个应用程序中.NET类型 到SQL数据库映射的完整集合. Configuration被用来构建一个(不可变的 (immutable)) ISessionFactory
下面是一个例子如何加载两个xml映射文件
方法1:
Configuration cfg = new Configuration()
.AddFile("Item.hbm.xml")
.AddFile("Bid.hbm.xml");
方法2:
Configuration cfg = new Configuration()//推荐这种方法,让NHibernate从嵌入式资源里面加载映射文件
.AddClass(typeof(NHibernate.Auction.Item))
.AddClass(typeof(NHibernate.Auction.Bid));
方法3:
Configuration cfg = new Configuration() //NHibernate会自动到应用程序集里查找所有的以.hbm.xml结尾的资源文件。
.AddAssembly( "NHibernate.Auction" ); //确保了应用程序集里的所有的xml映射文件都被加载。
如果使用Visual Studio .NET 和 NAnt 来编译应用程序集的话,请确保.hbm.xml文件被作为嵌入式资源编译进应用程序集。
获得ISessionFactory
ISessionFactory sessions = cfg.BuildSessionFactory();
NHibernate允许你的应用程序创建多个ISessionFactory实例。这对使用多个数据库的应用来说很有用
自行提供ADO.NET连接
IDbConnection conn = myApp.GetOpenConnection(); ISession session = sessions.OpenSession(conn);
可选的配置属性
警告: 其中一些属性是"系统级(system-level)的". 系统级属性只能通过在代码里设置NHibernate.Cfg.Environment类的静态属性 或者在配置文件里的<hibernate-configuration>配置节里来设置, 而不能用Configuration.SetProperties方法来设置
日志
NHibernate使用Apache log4net来为各种事件记录日志。
你可以从http://logging.apache.org/log4net/下载log4net。 你需要在应用程序配置文件添加一个log4net配置节用于配置log4net。 NHibernate的源代码分发包里有一个示例配置文件,位置在src/NHibernate.Test。
我们强烈建议你熟悉一下NHibernate的日志消息。在不失可读性的前提下, 我们做了很多工作, 使NHibernate的日志可能地详细。 这是必要的查错利器。 当你遇到问题的时候不要忘了设置show_sql开启SQL日志。
(Persistent Classes)
——一个实例的状态也可能是瞬时的或脱管的。
● Nhibernate推荐使用属性。
● 所有的持久化类都必须有一个 默认的构造方法(可以不是public的),这样的话Hibernate就可以使用 Activator.CreateInstance()来实例化它们。
● Nhibernate建议你对持久化类声明命名一致的标识属性。
● Nhibernate建议使用虚方法及非密封类
● 代理(proxies)是NHibernate的一个重要的功能,它依赖的条件是,持久化类或者是非密封(non-sealed)的并且所有的方法属性事件都被声明成了virtual类型的 ,或者是实现了一个所有方法都声明为public的接口。
● 你可以用NHibernate持久化一个没有实现任何接口的sealed类,但是你不能使用代理来延迟关联加载,这会限制你进行性能优化的选择。
● 如果持久化类需要在保存其持久化状态前进行合法性检查,它可以实现下面的接口IValidatable,不应该把Validate()调用和商业功能联系起来