对于Hibernate,从07年底接触过一点皮毛之后,就搁置了。现在趁着暑期实训,我得把NHibernate好好学习一下。
OK,首先说一下,为什么要用Hibernate、NHibernate这类玩意儿。
Hibernate和NHibernate,前者用于J2EE,后者用于asp.net。这种对象-关系型数据映射组件,也就是持久化框架的原理是一样的。
通常,我们会在MVC的业务逻辑层中,分离出一个“持久化层”,因为数据库的读写是一个很耗费时间和资源的操作,当大量用户同时直接访问数据库的时候,效率将非常低,如果中间有一个持久化层,就不需要每次从数据库读取数据,而是直接在内存中对数据进行操作,这样就节约了数据库资源,而且加快了系统的反应速度。况且,增加持久化层提高了开发的效率,使软件的体系结构更加清晰,在代码编写和系统维护方面变得更容易。这很符合面向对象开发的方式,便于并行开发。
但是,持久层的代码大多是些令人兴味索然的内容:获取数据库连接,执行SQL语句,关闭数据库连接……而Hibernate和NHibernate则封装了数据库持久层的大多数技术细节,事务管理,数据库连接管理,sql生成等。优良的设计大大提高了数据库访问层的开发效率,并且通过对数据访问中各种资源和数据的缓存调度,实现了更佳的性能。
从现在看来,Hibernate的学习资源还是远远多过NHibernate的,好在“NHibernate文档”已经攘括了NHibernate的要点,中文文档也翻译得很好。从使用的角度上,有很多人都推崇abluedog的NHibernate Step by Step,但现在NHibernate已经到2.0了,CodeSmith也到了5.1,配置方法有很大不同。
在配置文件中,nhibernate 2.0必须使用urn:nhibernate-configuration-2.2;而NHibernate1.2的是urn:nhibernate-configuration-2.0。相应的,在**.hbm.xml中,NHibernate2.0使用urn:nhibernate-mapping-2.2.
另外,配置文件的语法也有很大不同.我就是参照(http://hi.baidu.com/mytudousiprodb/blog/item/7fb9d78a0d15c7dbfd1f103c.html)解决问题的。但是,那文中的――“2、.hbm.xml 文件需要改动 如果是CodeSmith4.x版本自带的NHibernate生成的templates,那么请修改.hbm.xml的几个地方……”――我并没有做修改,却OK了。
我的环境是VS2008 SQL Server2005 NHibernate2.0.0
我的Person.hbm.xml内容如下:(BTW,**.hbm.xml文件属性设为“嵌入的资源”)
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Test.Model.Person, Test.Model" table="Person">
<id name="Id" type="Int32" unsaved-value="null">
<column name="id" length="4" sql-type="int" not-null="true" unique="true" index="PK_Person"/>
<generator class="native" />
</id>
<property name="Name" type="String">
<column name="name" length="50" sql-type="varchar" not-null="true"/>
</property>
</class>
</hibernate-mapping>
附上我的App.config内容:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="hibernate-configuration"
type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
</configSections>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider, NHibernate</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">
Server=(local)\WZT2009;initial catalog=NHibernate;Integrated Security=SSPI
</property>
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
</session-factory>
</hibernate-configuration >
</configuration>
经过很纠结的配置之后,我的NHibernate学习已经完成了Step1,OK,继续前进……