NHibernate中的API
本篇文章介绍的是NHibernate的各种API及其作用。
下图描述了NHibernate的API在分层架构中的作用,下面将进行详细说明。
NHibernate的接口大致分为四类:
1. 被应用程序调用进行基本数据操作(增、删、改、查)的接口。这些接口是应用程序的业务逻辑层和控制层与NHibernate的主要交互点。ISession, ITransaction, IQuery和ICriteria属于此类。
2. 被应用程序用来配置NHibernate的接口。Configuration就属此类。
3. 回调接口。应用程序用回调接口来响应NHibernate中触发的事件。这类接口包括Interceptor, ILifecycle和IValidatable等。
4. 用于扩展NHibernate的强大映射功能的接口。这类接口通常被应用程序的基础架构来实现。IUserType, ICompositeUserType, 和IIdentifierGenerator属于此类。
NHibernate充分利用.NET中已有的API, 包括ADO.NET和与之对应的ITransaction API,由于ADO.NET提供了针对不同数据库的抽象功能,这就使NHibernate几乎支持所有的数据库。
下面详细介绍NHibernate中的核心接口:
一、核心接口:
1. ISession.
ISession是NHibernate应用程序的主要接口,它提供NHibernate用于查询,更新,存储和删除对象的方法。ISession是轻量级的对象,易于创建和销毁。这一点很重要,因为在NHibernate应用程序中随时都可能需要创建session, 也许每一次页面请求都需要。需要注意的是,NHibernate session不是线程安全的,所以在设计的时候只能同时被一个线程使用。
NHibernate中session的含义介于传统的connection和transaction之间,可以把它看做与一个工作单元相关的对象的缓存或集合,NHibernate能够检测到这个工作单元中对象的变化。有时,Isession也被称作永久化管理器,因为它也是用于永久化操作的一个接口,比如存取对象。需要注意的是,NHibernate中的session和ASP.NET中的session没有任何关系.
2. ISessionFactory.
应用程序从ISessionFactory中获取ISession, ISessionFactory不是轻量级的对象,它被用来在多个应用程序线程中共享。通常整个应用程序中只有一个ISessionFactory的实例, 比如可以在应用程序初始化的时候创建。但是如果你的应用程序需要使用NHibernate访问多个数据库,就需要为每一个数据库创建一个ISessionFactory的实例。
ISessionFactory缓存了NHibernate运行过程中创建的SQL语句和其他的映射数据,它还可以放置一个工作单元中读取并且下一次工作单元或者session中可能用到的数据。ISessionFactory也可以用来配置类和集合的映射来使用二级缓存。
3. Configuration接口。
Configuration类是用来配置NHibernate的。应用程序用Configuration的实例在ISessionFactory创建前配置映射文件的位置以及设置NHibernate特定的属性。
虽然Configuration类在整个NHibernate应用程序中只占很小的一部分,但是它是我们开始用NHibernate时用到的第一个对象。
4. ITransaction接口。
这是一个可选接口,NHibernate应用程序可以不使用这个接口,而自己在基础架构代码中管理事务。NHibernate transaction从底层的事务(比如ADO.NET Transaction或者其他的Transaction)中抽象出来应用程序代码,这样应用程序代码就可以通过一系列连贯的客户端API来控制事务的边界,从而使NHibernate应用程序可以在不同的执行环境和容易中实现可移植性。
5. IQuery和ICriteria接口。
IQuery接口提供了强大的数据库查询能力,同时可以控制查询如何执行,是NHibernate获取数据的基本接口。查询写成HQL或者数据库原始的SQL语句。IQuery是轻量级的,只能在创建它的ISession内使用。它的作用是:绑定参数,限定查询返回的结果条数,然后执行查询。
ICriteria接口是一个与IQuery类似的接口,可以用来创建和执行面向对象的条件查询。
二、回调接口。
当一个对象发生一个事件(比如这个对象被加载、存储和删除)时,回调接口可以让应用程序收到一个通知。NHibernate应用程序并不需要实现这些事件,但是在执行一些通用的任务的时候它们很有用,比如创建审核记录的时候。
ILifeCycle和IValidatable接口让一个永久化对象能够响应与它的永久化生命周期相关的事件。永久化生命周期包含在一个对象的CRUD操作中,也就是在这个对象被创建,提取,更新和删除的时候。
(注意,NHibernate开发团队当初受其他具有这些接口的ORM解决方案的影响,后来他们意识到让永久化类实现这些NHibernate特定的接口会影响可移植性,所以这两个接口已经过期。)
IInterceptor接口可以让应用程序处理事件,同时又不必实现NHibernate特定的接口。IInterceptor接口的实现以参数的形式传递给永久化实例。
三、类型。
NHibernate种类型的概念在架构中是一个基本而有强大的元素。.NET的Type对象将.NET中的类型映射到数据库的列类型(一个类型可能扩展到多个数据表列)。所有永久化类的永久化属性,包括关联在内,都有对应的NHibernate类型。这种设计让NHibernate具有很强的灵活性和可扩展性,因为每一种关系型数据库都有一套NHibernate类型对应。
NHibernate包含了丰富的类型,涵盖了.NET基础类和很多CLR的类,包括DateTime, System.Enum, byte[], 和Serializable 类对应的类型。
NHibernate还支持用户自定义的类型。IUserType, ICompositeUserType和IParameterizedType这些接口就是用来给我们创建自己的类型用的,我们也可以用IUserCollectionType创建自己的集合类。NHibernate的这个特性,可以让我们很方便而简洁的处理应用程序中用到的类,比如Address,Name和MoneyAccount。自定义类型是NHibernate的一个核心属性,NHibernate团队鼓励我们尽量多并且有创造性的使用它。
四、扩展接口
NHibernate提供的大部分功能都是可配置的,这就允许我们在一些内置策略之间进行选择。当内置的策略足以满足我们的需要时,NHibernate还允许我们通过实现一些接口来插入我们自己的功能实现。插入点包括:
1. 主键的生成(IIdentifierGenerator接口)
2. SQL语言的支持(Dialect抽象类)
3. 缓存策略(ICache和ICacheProvider接口)。
4. ADO.NET连接管理(IConnectionProvider接口)。
5. 事务管理(ITransactionFactory和ITransaction接口)。
6. ORM策略(IClassPersister接口层级)
7. 属性访问策略(IPropertyAccessor接口)。
8. 代理创建(IProxyFactory接口)。
对于上述接口,NHibernate已经带了至少一种实现,所以,如果我们想扩展这些内置的功能,并不需要从头开始。
NHibernate中的API的更多相关文章
- HDFS中JAVA API的使用
HDFS中JAVA API的使用 HDFS是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件.删除文件.读取文件内容等操作.下面记录一下使用JAVA API对HDFS中的 ...
- Appium中部分api的使用方法
使用的语言是java,appium的版本是1.3.4,java-client的版本是java-client-2.1.0,建议多参考java-client-2.1.0-javadoc. 1.使用Andr ...
- NHibernate中,查询SqlServer数据库多个实体对象
关于datetime类型使用: Oracle: "and tb.EffectiveDate >= to_date(?,'yyyy-mm')" Sql: "an ...
- VB中的API详解
一.API是什么? 这个我本来不想说的,不过也许你知道其它人不知道,这里为了照顾一下新手,不得不说些废话,请大家谅解. Win32 API即为Microsoft 32位平台的应用程序编程接口(Appl ...
- elasticsearch中的API
elasticsearch中的API es中的API按照大类分为下面几种: 文档API: 提供对文档的增删改查操作 搜索API: 提供对文档进行某个字段的查询 索引API: 提供对索引进行操作 查看A ...
- NHibernate 中删除数据的几种方法
今天下午有人在QQ群上问在NHibernate上如何根据条件删除多条数据,于是我自己就写了些测试代码,并总结了一下NHibernate中删除数据的方式,做个备忘.不过不能保证囊括所有的方式,如果还有别 ...
- Linux 编程中的API函数和系统调用的关系【转】
转自:http://blog.chinaunix.net/uid-25968088-id-3426027.html 原文地址:Linux 编程中的API函数和系统调用的关系 作者:up哥小号 API: ...
- NHibernate 中使用 nvarchar(max) 类型
在 NHibernate 中使用字符串类型,默认会映射到字符类型,在 SQLServer 中,NVARCHAR 类型最大长度是 4000 字符,如果超过 4000,比如使用 SQL Server 中的 ...
- C#中调用API
介绍 API( Application Programming Interface ),我想大家不会陌生,它是我们Windows编程的常客,虽然基于.Net平台的C#有了强大的类库,但是,我们还是不能 ...
随机推荐
- css3 transition属性实现3d动画效果
transition属性是一个很强大的3d动画属性,我动手试了一下,很多在网上很火的网页动画都可以用这个属性实现,只能说这个属性是在是太强大啦,本人在学习次属性之后才知道自己对css3的认识还是偏少, ...
- WHY数学表达式的3D可视化
WHY数学表达式的3D可视化 很早之前我就有这种想法,将数学表达式的图形显示出来.最近终于实现了这套较为完善的版本,将其代码公布,也为开源做点贡献.首先系统中定义一套脚本语言格式,用于描述数学表达式. ...
- StackExchange.Redis 管道 批量 高性能插入数据
现在用redis来做数据缓存的越来越多了,很多项目都有初始化redis数据的过程,由于初始化的数据比较大,那么该过程越快越好.这里我们以HashSet方法为例, 这里我们推荐用HashEntry[] ...
- MySql之删除操作
一:删除特定行 DELETE FROM 表名 WHERE 条件: 二:删除所有行 TRUNCATE TABLE 表名; //删除重建一张表
- 10个优秀Objective-C和iOS开发在线视频教程
如果你自己开发iOS应用,你肯定会发现网上有很多资源.学习编程的一个最好的方法就是自己写代码,而开始写代码的最快的方式就是看其他人怎么写.我们从海量视频和学习网站中整理出了我们认为对你学习Object ...
- 【HTML打印】HTML直接调用window下的打印机并执行打印任务(简单打印任务生成)
1.<button onclick="preview('data');" id="print">打印</button> 2. 3.js: ...
- 深入理解JS执行细节(写的很精辟)
来源于:http://www.cnblogs.com/onepixel/p/5090799.html javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之 ...
- sed学习[参考转载]
一.选项与参数: -n :使用安静(silent)模式.在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上.但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者 ...
- “RESOURCE MONITOR“CPU占用特别高
背景: SQL Server 2008 R2 10.50.1600 没有设置页面文件,内存为64G,数据库分配50G cpu使用占了50%以上,平时只有10-20%,某台服务器“RESOURCE MO ...
- 小米手机安装mitmproxy证书
[本文出自天外归云的博客园] 问题描述 小米手机在连接mitmproxy代理后通过浏览器访问mitm.it下载android证书后无法成功安装证书 设备:Redmi Note 2(红米手机) 解决方法 ...