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#有了强大的类库,但是,我们还是不能 ...
随机推荐
- Java Web开发总结(一)
1.如何解决 tomcat 中文乱码问题? 2.如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet. <!-- 将Serv ...
- org.springframework.web.util.WebUtils.isSameOrigin(WebUtils.java:816)
Nginx反向代理WebSocket时报这个错,普通的http请求没问题,ws请求报错 可能原因: 1.你用了4.2.5.RELEASE版本或者4.2.6.RELEASE,升级到4.2.7.RELEA ...
- 【Yaml】Yaml学习笔记
转载:https://blog.csdn.net/moshenglv/article/details/52084899 YAML何许物也?在XML泛滥的情况下,YAML的出现的确让人眼前一亮,在初步学 ...
- awstats日志分析
nginx日志格式设定,去掉如下行#号 #vim /usr/local/nginx/conf/nginx.conf log_format access '$remote_addr -$remote_u ...
- Eclipse 4.5.0 离线安装 Veloeclipse 插件
下载 Veloeclipse 在 Eclipse eclipse-jee-mars-R-win32-x86_64 版本 4.5.0,Build id 为 20150621-1200,离线安装 Velo ...
- 第三部分:Android 应用程序接口指南---第二节:UI---第十一章 样式和主题
第11章 样式和主题 style是用于指定View或window的外观和格式的一系列属性的集合.style可以指定高(height).填补(padding).字体颜色.字体大小.背景颜色等等属性.st ...
- 菜鸟教程之工具使用(六)——让Maven项目直接在eclipse内部的Tomcat中运行
Hello,大家好,好久不见!最近终于安定下来了,可以静下心来写东西了.先写篇简单的,找找感觉.工具系列的本身就比较简单,没什么技术含量.因为说到底,工具只是辅助我们工作的,知道怎么用,然后剩下的就是 ...
- 9-8-B树-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版
课本源码部分 第9章 查找 - B树 ——<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集 ...
- hdoj:2023
#include <iostream> #include <string> #include <vector> ][],b[],c[]; using namespa ...
- 3D点云的深度学习
使用卷积神经网络(CNN)架构的深度学习(DL)现在是解决图像分类任务的标准解决方法.但是将此用于处理3D数据时,问题变得更加复杂.首先,可以使用各种结构来表示3D数据,所述结构包括: 1 体素网格 ...