hibernate是java的一个很好的OR mapping框架, http://hibernate.bluemars.net/, 我从1.0时就一直用他,很高兴nhibernate也在今年发布了。http://nhibernate.sourceforge.net/, 以下是一些简单介绍和比较
1. 动态生成class和interface.
OR Mapping需要实现persistence和domain层, hibernate用persistence object (PO)来实现persistence, Plain Old Java Object(POJO) 来实现domain, POJO因为需要包含business logic, 得由programmer来手写. PO给POJO提供一个数据库存储代理, 它对programmer来说是透明的. hibernate根据XML格式的HBM配置文件在运行期动态生成PO. 生成的手段是用CGLib(Code Generation Library), 一个java的开源库. http://cglib.sourceforge.net/
nhibernate也用手写Dotnet Object来实现domain object, 他的persistence object 是用DotNet framework的Dynamic Class 生成机制, 用到了System.Runtime.Serialization,Reflection 等NameSpace.
2. 提供一个类似Sql, 但支持面向对象特性(inheritence, polymorphism and association)的OR mapping查询语言HQL. ,
OR Mapping工具需要提供给programmer一种这样的语言, 比如EJB用EJBQL, 他会带来两方面的好处, 一是数据库无关, 用HQL查询, 用户不用考虑不同数据库查询SQL的差异, Hibernate提供很多不同的数据库方言类(SQL Dialect), 他会用数据库方言把HQL翻译成不同的数据库查询SQL. 这样程序数据库移植时只要更改数据库方言配置就可以了.
二是当hibernate从数据库得到数据后, 可很容易把HQL中的反映的对象间关系抽取出来.. 根据关系把数据放到不同的PO中.
目前hibernate和nhibernate的HQL Dialect包括Oracle 9i, MSSql, Sybase, Postgre, MySQL, Firebird
3.条件查询(Criteria Query)和原生SQL查询(Native SQL Query)
除了HQL外, hibernate在1.1以上还提供了条件查询和对原生SQL查询的支持, 原生SQL查询对于需要要求性能的程序来说很有用, 我们可以对SQL进行Tuning, 还可用stored proc.
nhibernate目前支持条件查询, 但不支持原生SQL查询
4. 事务支持,
hibernate同时支持本地事务和分布式事务. 对本地事务, 他是用JDBC的事务机制来解决的, programmer需要在代码中控制, 对分布式事务, 他是用JTA来解决.这象com+事务处理, 需要容器的支持.
目前nhibernate只支持本地事务, 采用ADO.NET的事务机制.
另外hibernate对长事务还提供了versioning 和Optimistic Locking的手段, 这也是EJB design pattern的标准模式
目前nhibernate也支持versioning 和Optimistic Locking的实现.
5. 线程同步处理
hibernate和nhibernate提供了session factory和session来解决这个问题, session factory是一个线程安全但开销大的对象, 它可被多个线程同时访问, session是线程不安全但开销小的对象, 只可被一个线程访问. 这样hibernate把需要线程共享的东西放在session factory,不需共享的放在session中.
6.文档
hibernate的文档包括5种语言, http://www.hibernate.org/5.html , hibernate在中国有专门的论坛,www.javaeye.com, 这个论坛上有很多java高手,他们义务合作翻译了hibernate的英文文档, 并发布到hibernate的官方站点, http://www.hibernate.org/hib_docs/reference/zh-cn/html/. 另外hibernate的作者gavin king写了一本hibernate in action,他们目前得到了作者的授权, 正在进行这本书的翻译。我在这里对他们表示感谢。
nhibernate的目前文档很简单, http://nhibernate.sourceforge.net/nh-docs/en/html/single/reference.html, 不过我们可以借助hibernate的文档