行情北京 上海 广州 深圳 沈阳 济南 郑州 武汉 长沙 南京 西安 成都 昆明 杭州
e杂志下载
 首页 | 资讯 网刊 视频 评测  企业:服务器 网络 存储 通信 安全 技术开发 信息化-方案 | ITPUB IXPUB
 商务笔记本 台式机 投影机 打印扫描 办公产品 耗材 软件 学院 下载 驱动  家庭数字家电 家庭组网
 个人DIY硬件 | 手机 GSM CDMA 无线电 GPS| 数码影像 相机 摄像机 | 消费数码 MP3 | 论坛 | 经销商社区
 报价中心 三维图秀 产品评论 产品大全 使用手册 术语详解 厂商专区 二手市场 维修服务 疑难解答 IT搜索
 

NHibernate文档-示例: Parent/Child

作者:DDLLY命名空间 发表日期:2007-04-26 11:41
  内容导航: 上一页 1 2 3 4 下一页
 
[IT168 技术文档]第7章 示例: Parent/Child

目录

关于collections
双向的一对多关系(Bidirectional one-to-many)
级联生命周期(Cascading lifecycle)
级联更新(Using cascading update()
结论

刚刚接触NHibernate的人大多是从父子关系(parent / child type relationship)的建模入手的。父子关系的建模有两种方法。比较简便、直观的方法就是在实体类Parent和Child之间建立 <one-to-many>的关联关系,从Parent指向Child,对新手来说尤其如此。但还有另一种方法,就是将Child声明为一个<composite-element> (组合元素)。可以看出在NHibernate中使用一对多关联比composite element更接近于通常parent / child关系的语义。下面我们会阐述如何使用双向可级联的一对多关联(bidirectional one to many association with cascades)去建立有效、优美的parent / child关系。这一点也不难!

关于collections

在NHibernate下,实体类将collection作为自己的一个逻辑单元,而不是被容纳的多个实体。这非常重要!它主要体现为以下几点:

  • 当删除或增加collection中对象的时候,拥有这个collection的实体对象的版本值会递增。

  • 如果一个从collection中移除的对象是一个值类型(value type)的实例,比如composite element,那么这个对象的持久化状态将会终止,其在数据库中对应的记录会被删除。同样的,向collection增加一个value type的实例将会使之立即被持久化。

  • 另一方面,如果从一对多或多对多关联的collection中移除一个实体( 一对多one-to-many 或者 多对多many-to-many关联),在缺省情况下这个对象并不会被删除。这个行为是完全合乎逻辑的--改变一个实体的内部状态不应该使与它关联的实体消失掉!同样的,向collection增加一个实体不会使之被持久化。

实际上,向Collection增加一个实体的缺省动作只是在两个实体之间创建一个连接而已,同样移除的时候也只是删除连接。这种处理对于所有的情况都是合适的。不适合所有情况的其实是父子关系本身,因为子对象是否存在依赖于父对象的生存周期。

双向的一对多关系(Bidirectional one-to-many)

让我们从一个简单的例子开始,假设要实现一个从类Parent到类Child的一对多关系。

<set name="Children"> <key column="parent_id" /> <one-to-many class="Child" /> </set>

如果我们运行下面的代码

Parent p = session.Load( typeof( Parent ), pid ) as Parent; Child c = new Child(); p.Children.Add( c ); session.Save( c ); session.Flush();

NHibernate就会产生下面的两条SQL语句:

  • 一条INSERT语句,用于创建对象c对应的数据库记录

  • 一条UPDATE语句,用于创建从对象p到对象c的连接

这样做不仅效率低,而且违反了列parent_id非空的限制。

上一页 1 2 3 4 下一页
【内容导航】  
第2页
第3页 第4页
【相关文章】  
下一篇:NHibernate文档-O/R Mapping基础
©版权所有。未经许可,不得转载。 【责任编辑:孙蓬阳
 
  网友评论