2009年3月18日

摘要: 多对多关系在数据库也是比较常见的,它通过一个中间表将两个主表关联起来。 下面来看看多对多关联在nh的实现,示例是一个User和Group之间的多对多关联。 先来看看User类的映射信息: 在多对多定义中,定义了中间表为UserGroups,此表只有两个字段:user_id和group_id;... 阅读全文
posted @ 2009-03-18 14:55 裴晓华 阅读(225) 评论(0) 推荐(0) 编辑
 
摘要: MAP文件,可以充当一个数据库的描述,例如数据库的基本关系,类型的定义,一般情况下,当给出了MAP文件,您完全可以根据它生成对应的数据库. using NHibernate; using NHibernate.Cfg; using NHibernate.Dialect; using NHiber... 阅读全文
posted @ 2009-03-18 14:54 裴晓华 阅读(191) 评论(0) 推荐(0) 编辑
 
摘要: 对数据库的操作是少不了事务处理的,事务能保整数据完整性和有效性。 在nh中,使用Transaction对象对.net的事务对象(实现了IDbTransaction接口的对象)进行了包装。 在nh中,一个典型的事务处理是这样的(见ISession.cs的注释) ISession sess = fa... 阅读全文
posted @ 2009-03-18 14:54 裴晓华 阅读(414) 评论(0) 推荐(0) 编辑
 
摘要: 当持久化对象时,显然必须存在把记录的值赋值到对象属性和取得对象属性的值用于持久化操作,对于更新操作,还需要检查对象的值是否已发生变化,即是否为Dirty,这些操作都是由对象的持久化类来完成的。有关持久化类可参考《会话和持久化操作》一文。 下面对NH的源码进行分析,以了解NH中数据加载和更新的过程... 阅读全文
posted @ 2009-03-18 14:53 裴晓华 阅读(222) 评论(0) 推荐(0) 编辑
 
摘要: 本文将对HQL查询文本的解析过程进行分析,这个可以说是NH中比较复杂的一块了(个人认为),涉及到的类也比较多。 建议阅读之前先深呼吸十下,看完之后脑袋成浆糊可不要找我哟。:-) 在HQL数据加载一文中,我们有提到QueryTranslator的创建过程,代码如下: //*** Session... 阅读全文
posted @ 2009-03-18 14:52 裴晓华 阅读(563) 评论(0) 推荐(0) 编辑
 
摘要: NH中,HQL是一个十分强大的面向对象的查询语言,简单的说,就是不需要使用实际的表名和列名来查询数据,而改用类名和属性。 有两种方式来执行HQL数据加载,一种是直接使用ISession的Find方法,另一种是使用IQuery接口。 IQuery接口提供了一些额外的设置,最重要的就是分页了,这个和I... 阅读全文
posted @ 2009-03-18 14:51 裴晓华 阅读(360) 评论(0) 推荐(0) 编辑
 
摘要: 在数据库的多对多关系中, 实现方法是通过一个额外的关联表将两个主表关联起来,关联表中只保存两个主表的主健,显然, 主表与关联表是一对多的关系. 这样两个主表就通过这个关联表构成了一个多对多的关系. 典型的例子就是用户和权限了, 每个用户可以有多个权限, 而每个权限也可以分配给多个用户. 通过一个用... 阅读全文
posted @ 2009-03-18 14:50 裴晓华 阅读(236) 评论(0) 推荐(0) 编辑
 
摘要: nh中的one-to-one(一对一)映射有两种情况, 一种是主键(PrimaryKey)关联, 一种是外健(ForeignKey)关联. 在主键关联的情况下, 显然必须有一个主键是根据别一个主键而来的, nh通过一个特殊的方式来处理这种情况, 要注意的是两个主健名称必须同名. 而外健一对一关联, ... 阅读全文
posted @ 2009-03-18 14:49 裴晓华 阅读(258) 评论(0) 推荐(0) 编辑
 
摘要: ICriteria是使用Expression进行数据加载的接口, 提供了设置表达式(Expression), 排序方式(Order), 分页记录等操作. 它使用一种类似于SQL语句where表达表的方式来加载满足条件的数据. 下面以一个查询Username为billy, Password为test的... 阅读全文
posted @ 2009-03-18 14:48 裴晓华 阅读(361) 评论(0) 推荐(0) 编辑
 
摘要: nh会话提供一种使用表达式(就像SQL语句的where表达式)来载入数据的方法, 以取得满足条件的对象集合。 通过CreateCriteria方法, 可以取得一个ICriteria接口, 这个接口用于操作表达式和排序字段. 由CriteriaImpl类实现,此类加有Internal修饰,因此不能在程... 阅读全文
posted @ 2009-03-18 14:47 裴晓华 阅读(211) 评论(0) 推荐(0) 编辑
 
摘要: 数据库中的主从表就是一对多的关系了,这种关系在按范式设计的数据库中是十分常见的.在nh中,通过one-to-many映射可以十分方便的处理这种关系,包括级联更新,删除等. 下面以一个简单的主从表来说明one-to-many的应用. 先来看看Parent类的映射信息: ... 阅读全文
posted @ 2009-03-18 14:46 裴晓华 阅读(278) 评论(0) 推荐(0) 编辑
 
摘要: 对象标识相当于数据表中的主键,在持久化中起着十分重要的作用,nhibernate通过对象标识来辨别两个持久对象是否相等。 在映射文件中,通过id属性来定义对象标识,内容如下: 其中unsaved-value属性用来指明对象未持久化时的值,如果此值与未持久化的对象... 阅读全文
posted @ 2009-03-18 14:45 裴晓华 阅读(272) 评论(0) 推荐(0) 编辑
 
摘要: 持久化操作由与持久对象关联的持久化类来完成,持久化类是实现IClassPersister接口的类,每个持久对象都有一个关联的持久化类,这些持久化类存储在会话工厂的classPersisters集合中,nhibernate允许用户通过自定义的持久化类来持久化数据。 IClassPersister接口... 阅读全文
posted @ 2009-03-18 14:44 裴晓华 阅读(347) 评论(0) 推荐(0) 编辑
 
摘要: 会话是nhibernate中的主要接口,也是我们进行持久化操作和数据加载的主要接口,ISession在IClassPersister、ITransaction、ICriteria和IQuery之间起着协调者的作用。 会话对象通过调用会话工厂的OpenSession方法获得,OpenSession... 阅读全文
posted @ 2009-03-18 14:43 裴晓华 阅读(351) 评论(0) 推荐(0) 编辑
 
摘要: 会话工厂是NHibernate中的关键类,它与数据库连接、数据库事务等进行交互,还存储着与所有持久对象类型关联的持久化对象,持久化类是持久化的关键,它实现基本的CRUD操作。 当用户需要持久操作时,由会话工厂创建一个会话供用户进行持久操作。 1. 会话工厂的创建 会话工厂由ISessionFa... 阅读全文
posted @ 2009-03-18 14:42 裴晓华 阅读(456) 评论(0) 推荐(0) 编辑
 
摘要: 配置信息用于指定NH以何种方式访问数据库, 根据这些配置信息, NH动态的创建数据访问对象并与数据库进行交互. 除了.net类库自带的Odbc, OleDb, OracleClient和SqlClient访问方式外, 在0.2版中, NH增加了用于访问MySQL和Firebird的访问方式, 这两种... 阅读全文
posted @ 2009-03-18 14:40 裴晓华 阅读(511) 评论(0) 推荐(0) 编辑
 
摘要: 在有些时候,可能需要直接执行SQL语句、存储过程等,但nhibernate并没有提供一种让我们执行SQL语句的方法,不过可以通过一些间接的方法来实现。 1. IDriver接口 IDriver接口就是数据访问的驱动器,对于不同的数据提供者(SqlClient, OleDb等)就有不同的驱动器,... 阅读全文
posted @ 2009-03-18 14:40 裴晓华 阅读(364) 评论(0) 推荐(0) 编辑
 
摘要: 为了让大家更好的了解NHibernate的功能和工作原理, 我们将对NHibernate的源代码进行全面的分析. 在此系列文章中, 我们做出以下约定: 为简化输入, 文中NHibernate均以NH代替; 若无特殊说明, 均以NHibernate 0.2.0.0的源代码为准; 文中在引用NH... 阅读全文
posted @ 2009-03-18 14:39 裴晓华 阅读(840) 评论(0) 推荐(0) 编辑