[NHibernate]组件之依赖对象

目录

写在前面

文档与系列文章

组件之依赖对象

一个例子

总结

写在前面

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

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

文档与系列文章

[Nhibernate]体系结构

[NHibernate]ISessionFactory配置

[NHibernate]持久化类(Persistent Classes)

[NHibernate]O/R Mapping基础

[NHibernate]集合类(Collections)映射 

[NHibernate]关联映射

[NHibernate]Parent/Child

[NHibernate]缓存(NHibernate.Caches)

[NHibernate]NHibernate.Tool.hbm2net

[NHibernate]Nullables

[NHibernate]Nhibernate如何映射sqlserver中image字段

[NHibernate]基本配置与测试 

[NHibernate]HQL查询 

[NHibernate]条件查询Criteria Query

[NHibernate]增删改操作

[NHibernate]事务

[NHibernate]并发控制

组件之依赖对象

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

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

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

 1 <component
 2         name="PropertyName"
 3         class="ClassName"
 4         insert="true|false"
 5         upate="true|false"
 6         access="field|property|nosetter|ClassName"
 7         optimistic-lock="true|false"
 8         <property ...../>
 9         <many-to-one .... />
10         ........
11 </component>

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

修改Customer类

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

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

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <!--assembly:程序集,namespace:命名空间-->
 3 <hibernate-mapping  xmlns="urn:nhibernate-mapping-2.2" assembly="Wolfy.Shop.Domain"  namespace="Wolfy.Shop.Domain.Entities">
 4   <class name="Wolfy.Shop.Domain.Entities.Customer,Wolfy.Shop.Domain" table="TB_Customer">
 5     <!--主键-->
 6     <id name="CustomerID" type="Guid" unsaved-value="null">
 7       <column name="CustomerID" sql-type="uniqueidentifier" not-null="true" unique="true"/>
 8       <generator class="assigned"></generator>
 9     </id>
10     <!--版本控制-->
11     <version name="Version" column="Version" type="integer"  unsaved-value="0"/>
12     <!--组件 name组件属性名-->
13     <component name="NameAddress" class="Wolfy.Shop.Domain.Entities.Name,Wolfy.Shop.Domain">
14       <!--Name类中的属性property-->
15       <property name="CustomerName" column ="CustomerName" type="string"
16                            length="16" not-null="false" />
17       <property name ="CustomerAddress" column="CustomerAddress" type="string"
18                            length="128" not-null="false" />
19     </component>
20   </class>
21 </hibernate-mapping>

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

测试

 1         /// <summary>
 2         /// 根据客户姓名和地址查找客户信息
 3         /// </summary>
 4         /// <param name="strCustomerName">姓名</param>
 5         /// <param name="strAddress">地址</param>
 6         /// <returns>客户信息集合</returns>
 7         public IList<Customer> 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<Customer>();
16         }

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

查看生成的sql

总结

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

时间: 2024-10-15 16:04:45

[NHibernate]组件之依赖对象的相关文章

NHibernate之旅(8):巧用组件之依赖对象

本节内容 引入 方案1:直接添加 方案2:巧用组件 实例分析 结语 引入 通过前面7篇的学习,有点乏味了~~~这篇来学习一个技巧,大家一起想想如果我要在Customer类中实现一个Fullname属性(就是Firstname和Lastname的组合)该怎么做呢? 方案1:直接添加 "我知道!修改Customer类,添加一个Fullname属性!即Customer.Fullname!" "恩,完全正确......" "这就意味着在Customer类中把Fir

[转]NHibernate之旅(8):巧用组件之依赖对象

本节内容 引入 方案1:直接添加 方案2:巧用组件 实例分析 结语 引入 通过前面7篇的学习,有点乏味了~~~这篇来学习一个技巧,大家一起想想如果我要在Customer类中实现一个Fullname属性(就是Firstname和Lastname的组合)该怎么做呢? 方案1:直接添加 “我知道!修改Customer类,添加一个Fullname属性!即Customer.Fullname!” “恩,完全正确......” “这就意味着在Customer类中把Firstname和Lastname两个属性重

基于ABP模块组件与依赖注入组件的项目插件开发

注意,阅读本文,需要先阅读以下两篇文章,并且对依赖注入有一定的基础. 模块系统:http://www.cnblogs.com/mienreal/p/4537522.html 依赖注入:http://www.cnblogs.com/mienreal/p/4550500.html 正文: 我最近在设计一个项目,而这个项目的一些业务功能,需要以插件的方式提供给这个项目,从而降低耦合性,主项目不会对具体业务功能产生依赖. 在以前,最简单粗暴的方式,就是扫描主程序目录下的所有dll或指定目录下的dll,然

NHibernate 组件基础 (第六篇)

NHibernate 组件基础 (第六篇) 一.组件简介 组件(Component)可以理解为被一个对象所包含的对象而持久化,而并非一个实体.简单说来,假如数据库有FirstName,LastName这两个字段,我们在C#中可以将这两个字段提取出来作为一个Name对象使用. 示例,首先建一张表,并添加数据如下: Person.hbm.xml <?xml version="1.0" encoding="utf-8" ?> <hibernate-map

NHibernate应用三:对象及配置

经过上一节的介绍,对整个NHibernate有了初步的了解,本节主要是介绍整个NHibernate的对象体系和配置内容. 一.对象 A.ISessionFactory(NHibernate.ISessionFactory) 针对单个数据库映射关系经过编译后的内存镜像,是线程安全的(不可变). 它是生成ISession的工厂,本身要用到IConnectionProvider. 该对象可以在进程或集群的级 别上,为那些事务之间可以重用的数据提供可选的二级缓存. B.ISession(NHiberna

sp_MSforeachdb&amp;sp_MSforeachtable&amp;sp_MSforeachobject&amp;查看某个对象的依赖对象

--查看某个对象的依赖对象 EXEC sp_MSforeachdb 'use ? ; IF EXISTS(SELECT top 1 1 FROM sys.syscomments WHERE text LIKE ''%test%'') SELECT ''?'' as dbname,object_name(id) as object FROM sys.syscomments WHERE text LIKE ''%test%''' --统计数据库里每个表的详细情况 exec sp_MSforeacht

.Net组件程序设计之对象生命周期

.Net组件程序设计之对象生命周期 .NET 垃圾回收 IDisposable() Using语句 .NET 垃圾回收 是CLR管理着垃圾回收器,垃圾回收器监控着托管堆,而我们使用的对象以及系统启动是所需要的一些必备的对象信息都存在于托管堆上,CLR会维护着一个列表(对象引用信息列表). 这个列表里存放的信息就是对应着托管堆中所有对象的信息(引用.被引用信息)每当使用一个新的对象或者是改变一个现有对象的引用CLR都会更新 对象引用信息列表.那么回收器一般什么时候调用呢? 垃圾回收器大多数是在托管

WPF 依赖属性与依赖对象

在介绍依赖属性之前,我先介绍下属性的历史 属性的历史: 早期C++的类中,只有字段及方法,暴露数据靠的是方法, 但是字段直接暴露会不安全,所以才用方法来暴露,在设置的时候加些约束,在MFC中就是这样的.但是为了访问某一个字段,总有设置及获得两个方法,太过分散,不利于管理.所以在C#中又引入了属性的概念,后来WPF又引入了依赖属性,可以节省实例对内存的开销,还可以通过binding依赖在其他对象上. 注意:字段是每个实例都要占用内存开销,而属性就如同方法(可以反编译查看,其实就是两个方法,这表示属

精通组件兼容性依赖

<<精通组件兼容性依赖>>,这篇文章首先从Java语言层面阐述了什么是兼容性,JDK是如何处理兼容性的?然后提出了一个最佳实践路线图,首先要保证你的组件包是面向接口编程的,别人可以稳定地依赖你的接口,而实现可以采用动态发现的机制去做.并用SLF4j和Maven Dependency插件作为推荐准则,讲解了它们的源码实现,顺便引出了臭名昭著的commons logging的ClassLoader问题,感兴趣的同学可以顺藤摸瓜,一探究竟.其次介绍了组件签名&兼容性保护策略,使用