博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[NHibernate]组件之依赖对象
阅读量:5946 次
发布时间:2019-06-19

本文共 3295 字,大约阅读时间需要 10 分钟。

目录

写在前面

周一至周四一直在成都出差,也一直没有更新博客了,一回到家第一件事就是扒一扒最近博客园更新的文章,然后把想看的收藏了,大概有20篇左右,包括基础的js或者jquery(快速浏览,复习基础),java方面的(主要了解实现业务的思想),asp.net webform\mvc(webform的快速浏览,mvc深入理解)等等,从昨天晚上到今天上午算是花费了7、8个小时的时间把收藏夹里面的文章看了一边。

现在就继续NHibernate系列的学习吧。

文档与系列文章

 

 

 

组件之依赖对象

现在有这样一个需求需要实现,我们要在Customer类中实现类似NameAddress的属性,即CustomerName=Name+Address(用名字和地址来标注一个客户的基本信息)。在Nhibernate中,可以使用dynamic-component和component快速的实现该功能。

映射文件中,<component>节点把子对象的一些属性映射为父类对应的表的一些字段。并且组件可以定义它们自己的属性、组件或者集合。

component和dynamic-component节点有如下图所示的属性:

1 
9
10 ........11

access(默认property):Nhibernate用来访问属性的策略。

class(默认通过反射得到的属性类型):组件类的名字。

insert:被映射的字段是否出现在sql的insert语句中。

name:属性名字propertyName。

update:被映射的字段是否出现在sql的update语句中。

unique:是否唯一。

optimistic-lock (可选 - 默认是 true):表明更新此组件是否需要获取乐观锁。

node:节点(可选)

lazy (可选): 假若设置lazy="false",就会禁用延迟加载。

<property>子标签为子类的一些属性与表字段之间建立映射。

  <component>元素允许加入一个 <parent>子元素,在组件类内部就可以有一个指向其容器的实体的反向引用。

  <dynamic-component>元素允许把一个 IDictionaryp映射为组件,其属性名对应键值

一个例子

新建一个Name类

1     ///  2     /// 描述:客户实体,数据库持久化类 3     /// 创建人:wolfy 4     /// 创建时间:2014-11-01 5     ///  6     public class Name 7     { 8         ///  9         /// 客户地址10         /// 11         public string CustomerAddress { get; set; }12         /// 13         /// 客户名字14         /// 15         public string CustomerName { get; set; }16         /// 17         /// 名字和地址18         /// 19         public string NameAddress20         {21             get { return this.CustomerName + this.CustomerAddress; }22         }23     }24 }

修改Customer类

1     ///  2     /// 描述:客户实体,数据库持久化类 3     /// 创建人:wolfy 4     /// 创建时间:2014-10-16 5     ///  6     public class Customer 7     { 8         ///  9         /// 客户id10         /// 11         public virtual Guid CustomerID { get; set; }12         /// 13         /// 客户名字14         /// 15         public virtual Name NameAddress { get; set; }16         /// 17         /// 版本控制18         /// 19         public virtual int Version { get; set; }20     }

去除Name和Address属性,修改客户名字属性为NameAddress,类型为新添加的Name类型。

修改Customer的映射文件

1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
17
19
20
21

首先定义Component的一些属性,指定属性名和组件映射的类名。再使用<property>子元素,为Name类的CustomerAddress、CustomerName属性与表字段之间建立映射。

测试

1         ///  2         /// 根据客户姓名和地址查找客户信息 3         ///  4         /// 姓名 5         /// 地址 6         /// 
客户信息集合
7 public IList
GetCustomerAddress(string strCustomerName, string strAddress) 8 { 9 NHibernateHelper nhibernateHelper = new NHibernateHelper();10 //获得ISession实例11 ISession session = nhibernateHelper.GetSession();12 return session.CreateQuery("from Customer as c where c.NameAddress.CustomerName=:cn and c.NameAddress.CustomerAddress=:ca")13 .SetString("cn", strCustomerName)14 .SetString("ca", strAddress)15 .List
();16 }

查询名字为“wolfy”和地址为“北京 海淀”的客户信息

查看生成的sql

总结

通过组件可改变我们的对象模型,而数据库结构不需要变化。通过利用组件来映射依赖对象,可以非常连贯的引入NHibernate中的多表映射关系、集合等内容。参考文章:

转载于:https://www.cnblogs.com/wolf-sun/p/4067026.html

你可能感兴趣的文章
js---12数据类型,数据类型转换,NaN,
查看>>
C字符串处理函数
查看>>
超短reads(primer、barcode、UMI、index等)比对方法
查看>>
lua正则表达式如何匹配中文
查看>>
arcgis api for js热力图优化篇-不依赖地图服务
查看>>
php逻辑操作符中&和&&的异同
查看>>
Git 远程仓库(分布式版本控制系统)
查看>>
设计模式原则之里氏替换原则
查看>>
LeetCode: Longest Common Prefix 解题报告
查看>>
Multipart polyline to single part lines
查看>>
zeromq_传说中最快的消息队列
查看>>
ARM的栈指令
查看>>
两个tomcat一起启动
查看>>
javax.imageio.IIOException: Unsupported Image Type
查看>>
Oracle DBA之监听的静态注册与动态注册
查看>>
Oracle Golden Gate 系列十七 -- GG 一对多 real-time data distribution 说明 与 示例
查看>>
大照片背景在网页设计中应用的精美作品范例(下篇)
查看>>
Realtek 8192cu win8 驱动
查看>>
property 中的strong 与weak
查看>>
使用HDFS java api 创建文件出错。
查看>>