NHibernate是一个基于.Net的针对关系型数据库的对象持久化(ORM)类库。NHibernate来源于非常优秀的基于Java的NHibernate关系型持久化工具。从数据库底NHibernate来持久化你的.Net 对象到关系型数据库。NHibernate为你处理这些,远胜于你不得不写SQL去从数据库存取对象。你的代码仅仅和对象关联,NHibernate自动产生SQL语句,并确保对象提交到正确的表和字段中去。
Spring.NET对NHibernate提供了很好的支持与封装。Spring.Data.NHibernate.Generic.Support和Spring.Data.NHibernate.Support下的HibernateDaoSupport是Spring.NET提供的数据库访问对象(DAO)的基类,两者的却别在于对泛型的支持程度。我们以Spring.Data.NHibernate.Generic.Support.HibernateDaoSupport为例,讲解Spring.NET整合NHibernate开发。
我归纳了一下,分为三个步骤:
一、实体对象的建立及配置
二、数据访问对象建立及配置
三、业务处理层建立及配置
首先让我们学习一下NHibernate的实体对象的映射:我建立两个实体“用户信息”和“公司信息”。图1所示。
图1
NHibernate要求实体必须是带有无参构造函数和带有virtual修饰的属性。两个实体的关系是双向(一对多——多对一)映射关系。
以上就是实体对象与数据的映射文件,提供的配置我不详细说明,请查看NHibernate的帮助手册。
接下来,我建立数据库访问对象(DAO)层。在这里我使用了泛型Repository模式。
数据库访问对象我们可以让它继承于HibernateDaoSupport类,该类的HibernateTemplate属性我们可以通过Spring.NET从外部注入。
db:provider节点是数据的连接字符串配置,我们引入xmlns:db="http://www.springframework.net/database这项命名空间便可以使用它。其中provider属性为数据库提供者的名称。以下是provider的详细情况:
名称 | 介绍 |
| Microsoft SQL Server, provider V1.0.5.0 in framework .NET V1.1 |
| Microsoft SQL Server, provider V2.0.0.0 in framework .NET V2.0 |
| Microsoft SQL Server Compact Edition, provider V9.0.242.0 |
| Microsoft SQL Server Compact Edition, provider V3.5.1.0 |
| provider V1.0.5000.0 in framework .NET V1.1 |
| provider V2.0.0.0 in framework .NET V2.0 |
| Oracle, Microsoft provider V2.0.0.0 |
| Oracle, Oracle provider V2.102.2.20 |
| MySQL provider 1.0.10.1 |
| MySQL provider 1.0.9 |
| MySQL provider 5.0.7.0 |
| MySQL provider 5.0.8.1 |
| MySQL provider 5.1.2.2 |
| MySQL provider 5.1.2.2 |
| MySQL provider 5.2.3.0 |
| Postgresql provider 1.0.0.0 (and 1.0.0.1 - were build with same version info) |
| Postgresql provider 1.98.1.0 beta 1 |
| Postgresql provider 2.0.0.0 |
| IBM DB2 Data Provider 9.0.0 for .NET Framework 1.1 |
| IBM DB2 Data Provider 9.0.0 for .NET Framework 2.0 |
| IBM DB2 Data Provider 9.1.0 for .NET Framework 1.1 |
| IBM DB2 Data Provider 9.1.0 for .NET Framework 2. |
| SQLite provider 1.0.43 for .NET Framework 2.0 |
| SQLite provider 1.0.43 for .NET Framework 2.0 |
| Sybase ASE provider for ASE 12.x |
| Sybase ASE provider for ASE 15.x |
| Sybase ADO.NET 2.0 provider for ASE 12.x and 15.x |
| ODBC provider V1.0.5000.0 in framework .NET V1.1 |
| ODBC provider V2.0.0.0 in framework .NET V2 |
InterSystems.Data.CacheClient | Caché provider Version 2.0.0.1 in framework .NET V2 |
可以根据自己的数据库选择不同的提供者名称。connectionString属性为数据库的连接字符串,这里用${xxx}的方式来表示一个占位符,因为我们经常将Spring.NET的配置文件设置为“嵌入系统资源”,这样一来在程序编译后就不能够修改,所以我们就要在应用程序配置文件中填写连接字符串,而不是在Spring.NET的配置文件中填写。
NHibernate中的Session控制取决于SessionFactory,Spring.NET提供了LocalSessionFactoryObject类来统一管理SessionFactory。其中MappingAssemblies属性为实体程序集的名称,可以填写多个名称。HibernateProperties为NHibernate的配置,dialect属性为数据库的方言,因为是SQL server 2K数据库,所以使用NHibernate.Dialect.MsSql2000Dialect 。proxyfactory.factory_class属性为延迟加载的代理类驱动,在NHibernate 2.1版中必须配置。hbm2ddl.auto属性为反向建立映射表的配置,我们配置为update后,NHibernate会帮我们自动根据实体的结构生成数据库中的表。
接下来我们看一下业务处理层。
代码的编写我不仔细讲,我们主要学习一下相关的配置。
我们在前几篇学过AOP拦截和事务代理。Spring.NET为NHibernate提供的事务代理是TransactionProxyFactoryObject。我们将改类的Target熟悉注入业务处理层的类,这样Spring.NET会为该类包装上事务。
最后我们写一个单元测试类,对业务层进行单元测试。
配置文件:
数据库我没有上传,因为空间的问题。我设置了自动建表的属性,可以用来自动创建数据库表结构。