Nhibernate是什么?
Nhibernate是一个对象关系映射(ORM)解决方案!是一个面向对象领域域模映射到传统的关系型数据库,他提供呢一个框架,其主要目的是为呢缓解开发者从关系数据库持久化编程任务的一个重要部分。
ORM(Object/Relation Mapping),对象关系映射,是一种解决某一方面或者问题的思想,其思想(个人理解)就是为呢解决或者缓解对象持久化的问题。而Nhibernate就是体现这一思想的过程。
比如:以前,我们通过写Sql语句和存储过程来对数据进行持久化,这样不仅容易出错,而且繁琐且出现大量重复代码,而现在,我们只需通过对象本身自己就插入、删除、更改、查找进行持久化等。而Nhibernate就替我们解决编写sql语句等任务。
当然,对于ORM,还可以同其他角度来进行理解,比如从映射角度来进行理解,映射的数学解释是集合A中元素a,在法则f情况下,在集合B中唯一存在b跟其对应。同样,程序内存中的一个确定对象,在关系型数据库中只有一条记录与之对应。我对对象直接的关系,仅从关系型数据库来理解的话,只有一对多,多对多,多对一等三个关系。
解释呢什么是Nhibernate和ORM后,应该对其有一个直观了解,就是解放劳动力!
现在开始通过Nhibernate来为我们减轻工作!
这里我们通过Nhibernate对一张表记录进行增、删、改、查,来初步了解Nhibernate!
其主要工作和流程如下:
1, 编写表Student,所对应的实体类Student(Class)。
2, 编写数据库与实体类沟通的基础Xml,这个属于映射文件。
3, 编写NHibernate对应的配置文件,告诉NHibernate如何连接数据库。
4, 调用Nh提供的API,对数据库进行操作。
具体方法如下:
1,编写表Student,所对应的实体类Student(Class)
这个地方在写属性的时候,要加上virtual虚方法的标示。
2,编写数据库与实体类对应的XML,映射文件。
可能你会问,为什么这个XML映射文件,会操作对应的表,Net中的Nhibernate是从Java的hibernate引申扩展过来的,其运用到反射的机制,这个我们和面的文章会详细说明反射,其中我们也自己编写一个基于ORM关系映射的文件,通过他,我们也会象Nhibernate那样进行数据库操作。
<?xmlversion="1.0"encoding="utf-8" ?>
<hibernate-mappingxmlns="urn:nhibernate-mapping-2.2">
<classname="MyNhibernate.Student, MyNhibernate"table="Student">
<idname="StudentId"column="StudentId"type="string"length="50">
<generatorclass="assigned" />
</id>
<propertyname="StudentName"column="STUDENTNAME"type="string"length="50"/>
<propertyname="StudentSex"column="STUDENTSEX"type="string"length="50"/>
<propertyname="StudentAddress"column="STUDENTADDRESS"type="String"length="50"/>
</class>
</hibernate-mapping>
3,编写NHibernate对应的配置文件,告诉NHibernate如何连接数据库。在web.conf里面进行配置。或者在单独的hibernate.cfg.xml里面
<configSections><sectionname="hibernate"type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>
</configSections>
<hibernate>
<propertyname="connection.driver_class">NHibernate.Driver.OracleClientDriver</property>
<propertyname="dialect">NHibernate.Dialect.Oracle10gDialect</property>
<propertyname="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<propertyname="connection.connection_string">
Data Source=ORACLEONE;User ID=SCOTT;Password=SCOTT
</property>
<propertyname="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
<mappingassembly="MyNhibernate"/>
</hibernate>
相关配置都配置成啦。现在开始在程序中调用
首先介绍几个Nhibernate组件提供的几个主要对象接口,这些对象就是操作数据的帮手
ISession,IsessionFactory,ITranSaction。
ISessionFactory,针对单个数据库映射后编译的内存镜像,是线程安全(不可变),他是Isession的工厂。
ISession,应用程序与持久存储层(数据库)交互操作的一个单线程对象,其生命周期短。隐藏呢ADO.Net连接,是ITranSaction的工厂。
ITranSaction,事物,指定原子操作单元范围,是单线程,生命周期短。他通过抽象从底层具体的ADO.NET事物隔开。在某些情况下,一个ISession之内可能包含多个ITranSaction.
首先,通过NH提供的Nhibernate.cfg.Configuration类,来创造一个ISessionFactory接口
public static readonly ISessionFactory sessionFactory;
sessionFactory = new NHibernate.Cfg.Configuration().Configure().BuildSessionFactory();
之后,在创造出一个获得的Isession的方法
publicstaticISession GetSession()
{
return sessionFactory.OpenSession();//创造一个ISesion接口对象
}
对象有呢,现在就使用其来操作数据吧CRUD吧!
问题:1,为什么在Session操作完成后,会使用到Flush()方法?
Save()方法会把一个瞬时对象转化为一个持久化对象,因此在Save()后,对象必须要有一个主键,如果是数据库自动生成的,在调用Save()方法后会立刻执行Insert语句,并获取插入后的对象,而主键设置为assigned,表示主键由用户在程序中分配,所以调用Save()方法后,Nhibernate会把需要Inert的对象放到一个集合中等待Insert,在使用Flush后才会执行Insert操作。
如果,把Student的主键改为native,那么调用Save()后立即执行Insert语句。
2,为什么ISessionFactory只创建一次,而我们使用把其初始化放在一个静态的构造方法里面?同时为什么每次操作数据对象都要获得一个ISession接口对象?
就像上面提到的,ISessionFactory是一个针对单个数据库线程安全的不可变,因为其在加载初始映射的时候,会消耗掉很多资源,因此只有一个对象,而采用静态的方法,在初始加载到内存中,就保证其只会加载创建一次。而Isession是一个单线程的,生命周期短的,里面封装一个ADO.NET连接数据,因此会每次都重新获得一个对象。
3,对提供给Nhibernate的配置文件(Info),是放在Web.Config里面,还是放在hibernate.cfg.xml里面,而程序在获得此信息进行初始化ISessionFactory对象时候的路径区别?
在静态类Dal里面,其中
new NHibernate.Cfg.Configuration().Configure()这个类提供的这个方法,是获得Info信息的,从而来初始化ISesionFactory对象的,有参数和无参数。
对于无参数来说,对于静态类Dal来说首先查找同目录里面的配置信息,没有在查找上一目录,知道根目录,先查找Web.Config里面的配置信息,在查找hibernate.cfg.xml里面的,以Web.Config为准。
对于有参数来说,
new NHibernate.Cfg.Configuration().Configure("Config\\hibernate.cfg.xml")
来说,通过这个查找来获得初始化的配置信息的。
对Web.Config 里面的configSections信息,该如何理解呢?
关于映射文件相关节点,因为有点多,就不贴上去!
下载地址:Nhibernate http://download.csdn.net/detail/zlhxiaohui/5569097