NHibernate源于非常优秀的基于Java的Hibernate关系型持久化工具。可是从2007年11月26日发布的1.2.1GA版本不是很好的支持VS2008。今天负责NHibernate开发的Ayende Rahien发布了NHibernate 2.0.0 Alpha 1,我们可以从这里下载,相信不久正式版会更好,先下载尝鲜一下。
下面列表列出了一些改进:
新特性
- 增加了一个类映射到多张表的联接映射元素
- 表和继承策略
- 针对PostgreSQL dialect的HQL函数‘current_timestamp’,‘str’和‘locate’
- VetoInterceptor - 通过IInterceptor接口取消删除、更新、插入的调用
- 在HQL查询语句中使用常量
- 增加NHibernate使用一个鉴别器对每个子类一张表的支持
- 增加对子查询的分页支持
- 在自定义的SQL查询里的自动类型发现
- 增加了 OnPreLoad和OnPostLoad生命周期事件
- 增加了 ThreadStaticSessionContext
- 增加了 标记to
- 增加了 foreign-key="none",虽然父表不具备not-found="ignore"。(这和SQL Server不相干)
- 增加了 DetachedQuery
- ExecuteUpdate支持原生的SQL查询
- 来自Hibernate的特性:
- 移植了 Actions, Events和Listeners
- 移植了 StatelessSession
- 移植了 CacheMode
- 移植了 Statistics
- 移植了 QueryPlan
- 移植了 ResultSetWrapper
- 移植了 Structured/Unstructured cache
- 移植了 SchemaUpdate
- 移植了 Hibernate.UserTypes
- 移植了 Hibernate.Mapping
- 移植了 Hibernate.Type
- 移植了 EntityKey
- 移植了 CollectionKey
- 移植了 TypedValue
- 移植了 SQLExceptionConverter
- 移植了 Session Context
- 移植了 CascadingAction
重大变化:
- NHibernate.Expression命名空间更改为NHibernate.Criterion
- NHibernate.Property命名空间更改为NHibernate.Properties
- 没有事务外的AutoFlush -- 数据库事务不是可选的,数据库的所有通信都有一个事务,不管是读还是写数据
- 将忽略配置节,使用配置节代替(注意它们有不同的XML格式)
- 配置值不再需要前缀“hibernate.”,如果你以前指定“hibernate.dialect“,现在只要使用".dialect”
- 接口修改-IItnterceptor更改为匹配Hibernate 3.2的Interceptor
- 对所有的命名查询在初始化的时候执行验证,任何无效的查询会抛出异常
- NHibernate在SQL Server上查询count(*)返回是长整形(long)
- SaveOrUpdateCopy返回一个新的实体实例,不会更改原始实体
- 修改了接口INamingStrategy
- NHiberate.Search -Index/Store属性移到了Attributes命名空间
- 修改了IType、IEntityPersister、IVersionType -- 对此感兴趣的可能只是对NHibernate疯狂热爱的人
- 需要的时候必须包含括号
- 修改了接口IBatcher
修复的缺陷:
- 修复了HQL查询的表达式映射
- 修复了里面有一个 ;里面有一个 导致的异常
- 不支持限制大小的SQL dialects不支持多条件分页
- 修复了MsSql2005 dialect在多个处理器的计算机上有限制的字符串排序不正确的问题
- 修复了当在另一个子表达式中使用SimpleSubqueryExpression时得到的是NullReferenceException的问题。
- 修复了当删除一个包含空值的对象时引发的空引用异常
- 修复了在复杂联接表的重复列名
- 修复了MultiQuery在所有的查询强制使用参数
- 修复了当参数包含一个逗号和使用MaxResults时concat函数不能正常工作
- 修复了在MSSQL 2005 dialect 使用表达式分页不能正常工作
- 修复了OersustebtEnumType不正确的处理具有零值定义的枚举
- 修复了当没有使用SetFirstResult()时SetMaxResults()返回至少一行
- 修复了在SQL Server 2005的GetLimitSring 使用总计排序的缺陷
- 修复了SessionImpl.EnableFilter当已经启用的时候返回错误的过滤器
- 修复了Generated Id不能用于MySQL
- 修复了一对一不能延迟加载
- 修复了不会生成悲观锁定的FOR UPDATE语句
改进:
- Postgre Dialect增加对Guid的支持
- 查询语句中支持注释
- ISession增加了Merge和Persist
- SQL Server支持IFF
- IdBag现在支持Identity列
- 多条件(Criteria)现在使用结果转换器
- 处理key-many-to-one 键和找不到资源
- 可以在映射中指定抽象类
指南:
- 选择使用Restrictions而不是Expression类来定义Criteria查询。
子项目:
- 增加了NHibernate.Validator
- 增加了NHibernate.Shards
- NHibernate.Search更新到和Hibernate Search 3.0相匹配
条件API:
- 允许检查、遍历、克隆和转换ICriteria以及DetachedCriteria
- 引入CriteriaTransformer 类
- GetCriteriaByPath、GetCriteriaByAlias
- 增加了DetachedCriteria.For
- 增加了多条件
- Projections现在可以将参数传递到生成的SQL语句。
- 增加了从Criteria中调用(HQL概念的)Sql函数的支持
- 增加了ConstantProjection
- 增加了CastProjection
- 能够使用IProjection作为ICriterion的参数
代理验证的支持更好:
- 现在支持internal字段的检查
- 更新了Castle.DynamicProxy2.dll,更好的支持.NET 2.0 SP1
SQL Lite:
- 支持多查询和多条件
- 支持子查询和limits
- 允许DROP TABLE IF EXISTS语句
PostgreSQL (Npgsql):
- 启用PostgreSQL的多查询支持
FireBird:
- 更好的全面支持
批处理:
- 更改了日志记录使其更清晰的表达所有的命令在单个批处理被发送到数据库。
- AbstractBatcher现在使用侦听器,允许用户在准备好之前拦截和修改SQL。
错误处理:
- 在获取Int32Type中的值异常的更友好错误信息
- 当使用的子查询中包含一个不存在的属性时的更友好的错误信息
- 当带一个值类型调用UniqueResult()和查询返回null时抛出更有意义的异常
- 整体上更好的错误处理
- 更友好的调试日志
重构:
- 在框架内部的重要重构使用了泛型集合类代替非泛型的集合性。
- 对配置系统和hbm文件的解析进行了重要重构。
工厂:
- 增加了ProxyFactoryFactory
- 增加了BatchingBatcherFactory