技术标签: C# schema postgresql NHibernate assembly 数据库 class sql server
上一篇:NHibernate ORM介绍及优缺点-NHibernate入门到精通系列1中介绍了NHibernate与ORM,读者对其有一个感性的认识。
本节,将继续此系统,介绍:NHibernate开发环境与配置和其体系结构知识。
下面为正文内容:
一、NHibernate的开发环境
官网地址:http://nhforge.org/
NHibernate3为目前最新的版本,其下载地址是:http://sourceforge.net/projects/nhibernate/files/NHibernate/
下载并解压NHibernate-3.0.0.GA-bin.zip后,如图1.1所示。
文件夹介绍:
Required_Bins:NHiberante主程序的dll程序集。
(1).Antlr3.Runtime.dll为:Antlr的程序集。Antlr(ANother Tool for Language Recognition)是一个工具,它为我们构造自己的识别器(recognizers)、编译器(compiler)和转换器(translators)提供了一个基础。通过定义自己的语言规则,Antlr可以为我们生成相应的语言解析器,这样便可以省却了自己全手工打造的劳苦。
(2).Iesi.Collections.dll为:NHibernate程序的集合库,因为在.NET4.0之前,没有提供ISet这样的集合,所以NHiberante框架的设计者们就将ISet这样的集合放置在这个程序集里。我建议NHiberante框架的设计人员,在.NET4.0以后的程序,使用System.Collections.Generic.ISet<T>这个接口。
(3).NHibernate.dll为主程序集
(4).Remotion.Data.Linq.dll为:NHibernate to Linq的类库。
(5).nhibernate-configuration.xsd和NHibernate-mapping.xsd分别为NHibernate程序配置和映射配置的xsd文件,我们把这个两个文件复制到Microsoft Visual Studio安装目录的\Xml\Schemas下,就会有xml的自动提示功能。
二:NHibernate开发环境与配置
由于NHibernate是为了能在各种不同环境下工作而设计的, 因此存在着大量的配置参数. 幸运的是多数配置参数都有比较直观的默认值。我打开MSSQL.cfg文件,如图所示,可以观察到NHibernate的配置。
图3.1
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。 |
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何时释放数据库连接。 例如: auto (默认) | on_close | after_transaction 注意,这些设置仅对通过ISessionFactory.OpenSession得到的ISession起作用。 对于通过ISessionFactory.GetCurrentSession得到的ISession, 所配置的ICurrentSessionContext实现控制这些ISession的连接释放模式。 |
command_timeout |
指定NHibernate生成的IDbCommands对象的超时时间。 . |
adonet.batch_size |
指定用ADO.Net的批量更新的数量,默认设置为0(不启用该功能)。 |
proxyfactory.factory_class |
代理工厂配置。用于指定是哪个中间件提供的延迟加载代理 |
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 query.substitutions true=1, false=0 将导致符号true和false在生成的SQL中被翻译成整数常量 |
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 |
关系型数据库 |
方言 |
备注 |
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 8g |
NHibernate.Dialect.Oracle8iDialect |
|
Oracle 9g |
NHibernate.Dialect.Oracle9Dialect |
|
Oracle 10/11g |
NHibernate.Dialect.Oracle10gDialect |
|
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 2008 |
NHibernate.Dialect.MsSql2008Dialect |
|
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的结构体系
图2.1
从图2.1可以看出,NHibernate使用数据库和配置信息来为应用程序提供持久化服务(以及持久的对象)。
我们来更详细地看一下NHibernate运行时体系结构。由于NHibernate非常灵活,且支持多种应用方案, 所以我们这只描述一下两种极端的情况。“轻型”的体系结构方案,要求应用程序提供自己的ADO.NET 连接并管理自己的事务。这种方案使用了NHibernate API的最小子集:
图2.2
“全面解决”的体系结构方案,将应用层从底层的ADO.NET API中抽象出来,而让NHibernate来处理这些细节。
图2.3
图2.3中各个对象的定义如下:
ISessionFactory (NHibernate.ISessionFactory)针对单个数据库映射关系经过编译后的内存镜像,是线程安全的(不可变)。 它是生成ISession的工厂,本身要用到IConnectionProvider。 该对象可以在进程或集群的级别上,为那些事务之间可以重用的数据提供可选的二级缓存。
表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期很短。 其隐藏了ADO.NET连接,也是 ITransaction的工厂。 其会持有一个针对持久化对象的必选(第一级)缓存, 在遍历对象图或者根据持久化标识查找对象时会用到。
带有持久化状态的、具有业务功能的单线程对象,此对象生存期很短。 这些对象可能是普通的POCOs, 唯一特殊的是他们正与(仅仅一个)ISession相关联。 一旦这个ISession被关闭, 这些对象就会脱离持久化状态,这样就可被应用程序的任何层自由使用。 (例如,用作跟表示层打交道的数据传输对象。)
那些目前没有与ISession关联的持久化类实例。 他们可能是在被应用程序实例化后, 尚未进行持久化的对象。 也可能是因为实例化他们的ISession已经被关闭而脱离持久化的对象。
(可选的)应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短。 它通过抽象将应用从底层具体的ADO.NET事务隔离开。 某些情况下,一个ISession之内可能包含多个ITransaction对象。
(可选的)生成ADO.NET连接以及Command对象的工厂。 它通过抽象将应用从底层的IDbConnection或IDbCommand隔离开。 仅供开发者扩展/实现用,并不暴露给应用程序使用。
(可选的)一个封装了不同ADO.NET providers之间的差异(利用参数命名转换等ADO.NET支持的特性)的接口。
(可选的)生成ITransaction对象实例的工厂。 仅供开发者扩展/实现用,并不暴露给应用程序使用。
文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr
文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc
文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8
文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束
文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求
文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname
文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<iostream>#include<stack>#include<queue>using namespace std;typed_二叉树的建立
文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码
文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词
文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限
文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定
文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland