本篇文章介绍的是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的更多相关文章

  1. HDFS中JAVA API的使用

    HDFS中JAVA API的使用   HDFS是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件.删除文件.读取文件内容等操作.下面记录一下使用JAVA API对HDFS中的 ...

  2. Appium中部分api的使用方法

    使用的语言是java,appium的版本是1.3.4,java-client的版本是java-client-2.1.0,建议多参考java-client-2.1.0-javadoc. 1.使用Andr ...

  3. NHibernate中,查询SqlServer数据库多个实体对象

    关于datetime类型使用:  Oracle:  "and tb.EffectiveDate >= to_date(?,'yyyy-mm')" Sql:  "an ...

  4. VB中的API详解

    一.API是什么? 这个我本来不想说的,不过也许你知道其它人不知道,这里为了照顾一下新手,不得不说些废话,请大家谅解. Win32 API即为Microsoft 32位平台的应用程序编程接口(Appl ...

  5. elasticsearch中的API

    elasticsearch中的API es中的API按照大类分为下面几种: 文档API: 提供对文档的增删改查操作 搜索API: 提供对文档进行某个字段的查询 索引API: 提供对索引进行操作 查看A ...

  6. NHibernate 中删除数据的几种方法

    今天下午有人在QQ群上问在NHibernate上如何根据条件删除多条数据,于是我自己就写了些测试代码,并总结了一下NHibernate中删除数据的方式,做个备忘.不过不能保证囊括所有的方式,如果还有别 ...

  7. Linux 编程中的API函数和系统调用的关系【转】

    转自:http://blog.chinaunix.net/uid-25968088-id-3426027.html 原文地址:Linux 编程中的API函数和系统调用的关系 作者:up哥小号 API: ...

  8. NHibernate 中使用 nvarchar(max) 类型

    在 NHibernate 中使用字符串类型,默认会映射到字符类型,在 SQLServer 中,NVARCHAR 类型最大长度是 4000 字符,如果超过 4000,比如使用 SQL Server 中的 ...

  9. C#中调用API

    介绍 API( Application Programming Interface ),我想大家不会陌生,它是我们Windows编程的常客,虽然基于.Net平台的C#有了强大的类库,但是,我们还是不能 ...

随机推荐

  1. caffe中的fine-tuning

    caffe finetune两种修改网络结构prototxt方法 第一种方法:将原来的prototxt中所有的fc8改为fc8-re.(若希望修改层的学习速度比其他层更快一点,可以将lr_mult改为 ...

  2. SpringBoot自定义线程池处理异步任务

    @Async异步调用 就不解释什么是异步调用了,Spring Boot中进行异步调用很简单 1.通过使用@Async注解就能简单的将原来的同步函数变为异步函数 package com.winner.s ...

  3. 【T03】理解私有地址和NAT

    1.私有地址包括三块: 10.0.0.0 到 10.255.255.255 172.16.0.0 到 172.31.0.0 192.168.0.0 到 192.168.255.255 2.私有地址接入 ...

  4. Spark机器学习(4):朴素贝叶斯算法

    1. 贝叶斯定理 条件概率公式: 这个公式非常简单,就是计算在B发生的情况下,A发生的概率.但是很多时候,我们很容易知道P(A|B),需要计算的是P(B|A),这时就要用到贝叶斯定理: 2. 朴素贝叶 ...

  5. 1.5.3 GROUP BY子句

    1.5.3 GROUP BY子句正在更新内容.请稍后

  6. fiddler模拟发送get/post请求(也可做简单接口测试)

    1.模拟发送请求 (1)fiddler设置post接口信息及参数,点击execute发送请求 (2)fiddler设置get接口信息及参数,点击execute发送请求            2.发送请 ...

  7. Swap 分区的2种方式 详解与例子

    安装完Linux系统后,swap分区太小怎么办,怎么可以扩大Swap分区呢?有两个办法,一个是从新建立swap分区,一个是增加swap分区.下面介绍这两种方法: 第一您必须有root权限,过程中一定要 ...

  8. Effective Java 第三版——54. 返回空的数组或集合不要返回null

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  9. VisualStudio2013下安装Python Flask/jade

    为什么是Python? 不做程序的工作好久了,当创业成为工作后越发发现时间的宝贵.时间那么少,需求确实多样的,软件的,web的,还得跨平台,以前熟悉的.Net明显每一项满足的.选来选去还是Python ...

  10. 译:4.RabbitMQ Java Client 之 Routing(路由)

    在上篇博文 译:3.RabbitMQ 之Publish/Subscribe(发布和订阅)  我们构建了一个简单的日志系统 我们能够向许多接收者广播日志消息. 在本篇博文中,我们将为其添加一个功能 - ...