一、新建一个类库,命名为:DAO
二、新建接口:IRepository
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Repository { public interface IRepository<T> { void Delete(T entity); T Get(object id); object Save(T entity); void Update(T entity); } }
实现该接口
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Spring.Data.NHibernate.Generic.Support;//引用Spring.Data.NHibernate21.dll namespace Repository { public class NHibernateRepository<T> : HibernateDaoSupport,IRepository<T> { public void Delete(T entity) { this.HibernateTemplate.Delete(entity); } public T Get(object id) { return this.HibernateTemplate.Get<T>(id); } public object Save(T entity) { return this.HibernateTemplate.Save(entity); } public void Update(T entity) { this.HibernateTemplate.Update(entity); } } }
在这里,同样继承了HibernateDaoSupport类,后面配置文件中将使用该类中的HibernateTemplate属性。该类的引用需要引入Spring.Data.NHibernate21.dll文件。
三、配置文件
1 <?xml version="1.0" encoding="utf-8" ?> 2 <objects xmlns="http://www.springframework.net" 3 xmlns:db="http://www.springframework.net/database"> 4 <!-- 用以我们在其它的应用程序中,配置数据访问 5 如:我们在MVCDemo项目中添加数据库连接,则这样配置: 6 <configuration> 7 <databaseSettings> 8 <add key="db.datasource" value="LIPPOR-PCLIPPOR"/> 9 <add key="db.user" value="sa"/> 10 <add key="db.password" value="123"/> 11 <add key="db.database" value="SpringNetDB"/> 12 </databaseSettings> 13 </configuration> 14 就可以将数据传递过来 15 --> 16 <object type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core"> 17 <property name="ConfigSections" value="databaseSettings"/> 18 </object> 19 20 <!-- 数据库和Nhibernate的相关配置 --> 21 <db:provider id="DbProvider" provider="SqlServer-2.0" 22 connectionString="Server=${db.datasource};database=${db.database};uid=${db.user};pwd=${db.password};"/> 23 24 <!--SessionFactory对象,其中包括一些比较重要的属性 --> 25 <object id="NHibernateSessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate21"> 26 <!-- 关于数据库连接的配置,直接使用 DbProvider 中的设置,这样,不需要为 Hibernate 再提供连接串和驱动 --> 27 <property name="DbProvider" ref="DbProvider"/> 28 <!-- 包含有映射文件的程序集,需要分析的hbm程序集名称 --> 29 <property name="MappingAssemblies"> 30 <list> 31 <value>Model</value> 32 </list> 33 </property> 34 35 <property name="HibernateProperties"> 36 <dictionary> 37 <entry key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/> 38 <entry key="dialect" value="NHibernate.Dialect.MsSql2008Dialect"/> 39 <entry key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver"/> 40 <entry key="use_outer_join" value="true"/> 41 <entry key="show_sql" value="false"/> 42 <!--自动建表(反向映射)--> 43 <entry key="hbm2ddl.auto" value="update"/> 44 <entry key="adonet.batch_size" value="10"/> 45 <entry key="command_timeout" value="60"/> 46 <!--显式启用二级缓存--> 47 <entry key="cache.use_second_level_cache" value="true"/> 48 <!--启动查询缓存--> 49 <entry key="cache.use_query_cache" value="false"/> 50 <entry key="query.substitutions" value="true 1, false 0, yes 'Y', no 'N"/> 51 <entry key="proxyfactory.factory_class" value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle"/> 52 </dictionary> 53 </property> 54 <!-- 与 Spring 的声明式事务集成 --> 55 <property name="ExposeTransactionAwareSessionFactory" value="true" /> 56 </object> 57 58 <object id="HibernateTemplate" type="Spring.Data.NHibernate.Generic.HibernateTemplate"> 59 <property name="SessionFactory" ref="NHibernateSessionFactory" /> 60 <property name="TemplateFlushMode" value="Auto" /> 61 <property name="CacheQueries" value="true" /> 62 </object> 63 64 <!--id:名称,供Service项目中service.xml引用 65 type:类型。格式为 "命名空间.类名,程序集名称"--> 66 <object id="dao.users" type="DAO.NHibernateRepository<Model.Users>, DAO"> 67 <!--HibernateTemplate:好像Spring.Data.NHibernate.Generic.HibernateTemplate类中属性名称,必须对应,所有不能修改--> 68 <!--ref对应上面ID为HibernateTemplate的object--> 69 <property name="HibernateTemplate" ref="HibernateTemplate"/> 70 </object> 71 72 <object id="dao.roles" type="DAO.NHibernateRepository<Model.Roles>, DAO"> 73 <property name="HibernateTemplate" ref="HibernateTemplate"/> 74 </object> 75 76 <object id="dao.permission" type="DAO.NHibernateRepository<Model.Permission>, DAO"> 77 <property name="HibernateTemplate" ref="HibernateTemplate"/> 78 </object> 79 </objects>
刘东老师的播客里有这么段注释:
“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会帮我们自动根据实体的结构生成数据库中的表。”
最后,设置配置文件的属性: