[NHibernate]组件之依赖对象
目录
写在前面
周一至周四一直在成都出差,也一直没有更新博客了,一回到家第一件事就是扒一扒最近博客园更新的文章,然后把想看的收藏了,大概有20篇左右,包括基础的js或者jquery(快速浏览,复习基础),java方面的(主要了解实现业务的思想),asp.net webform\mvc(webform的快速浏览,mvc深入理解)等等,从昨天晚上到今天上午算是花费了7、8个小时的时间把收藏夹里面的文章看了一边。
现在就继续NHibernate系列的学习吧。
文档与系列文章
[NHibernate]持久化类(Persistent Classes)
[NHibernate]集合类(Collections)映射
[NHibernate]缓存(NHibernate.Caches)
[NHibernate]NHibernate.Tool.hbm2net
[NHibernate]Nhibernate如何映射sqlserver中image字段
[NHibernate]条件查询Criteria Query
组件之依赖对象
现在有这样一个需求需要实现,我们要在Customer类中实现类似NameAddress的属性,即CustomerName=Name+Address(用名字和地址来标注一个客户的基本信息)。在Nhibernate中,可以使用dynamic-component和component快速的实现该功能。
映射文件中,<component>节点把子对象的一些属性映射为父类对应的表的一些字段。并且组件可以定义它们自己的属性、组件或者集合。
component和dynamic-component节点有如下图所示的属性:
<component
name="PropertyName"
class="ClassName"
insert="true|false"
upate="true|false"
access="field|property|nosetter|ClassName"
optimistic-lock="true|false"
<property ...../>
<many-to-one .... />
........
</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类
/// <summary>
/// 描述:客户实体,数据库持久化类
/// 创建人:wolfy
/// 创建时间:2014-11-01
/// </summary>
public class Name
{
/// <summary>
/// 客户地址
/// </summary>
public string CustomerAddress { get; set; }
/// <summary>
/// 客户名字
/// </summary>
public string CustomerName { get; set; }
/// <summary>
/// 名字和地址
/// </summary>
public string NameAddress
{
get { return this.CustomerName + this.CustomerAddress; }
}
}
}
修改Customer类
/// <summary>
/// 描述:客户实体,数据库持久化类
/// 创建人:wolfy
/// 创建时间:2014-10-16
/// </summary>
public class Customer
{
/// <summary>
/// 客户id
/// </summary>
public virtual Guid CustomerID { get; set; }
/// <summary>
/// 客户名字
/// </summary>
public virtual Name NameAddress { get; set; }
/// <summary>
/// 版本控制
/// </summary>
public virtual int Version { get; set; }
}
去除Name和Address属性,修改客户名字属性为NameAddress,类型为新添加的Name类型。
修改Customer的映射文件
<?xml version="1.0" encoding="utf-8" ?>
<!--assembly:程序集,namespace:命名空间-->
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Wolfy.Shop.Domain" namespace="Wolfy.Shop.Domain.Entities">
<class name="Wolfy.Shop.Domain.Entities.Customer,Wolfy.Shop.Domain" table="TB_Customer">
<!--主键-->
<id name="CustomerID" type="Guid" unsaved-value="null">
<column name="CustomerID" sql-type="uniqueidentifier" not-null="true" unique="true"/>
<generator class="assigned"></generator>
</id>
<!--版本控制-->
<version name="Version" column="Version" type="integer" unsaved-value="0"/>
<!--组件 name组件属性名-->
<component name="NameAddress" class="Wolfy.Shop.Domain.Entities.Name,Wolfy.Shop.Domain">
<!--Name类中的属性property-->
<property name="CustomerName" column ="CustomerName" type="string"
length="16" not-null="false" />
<property name ="CustomerAddress" column="CustomerAddress" type="string"
length="128" not-null="false" />
</component>
</class>
</hibernate-mapping>
首先定义Component的一些属性,指定属性名和组件映射的类名。再使用<property>子元素,为Name类的CustomerAddress、CustomerName属性与表字段之间建立映射。
测试
/// <summary>
/// 根据客户姓名和地址查找客户信息
/// </summary>
/// <param name="strCustomerName">姓名</param>
/// <param name="strAddress">地址</param>
/// <returns>客户信息集合</returns>
public IList<Customer> GetCustomerAddress(string strCustomerName, string strAddress)
{
NHibernateHelper nhibernateHelper = new NHibernateHelper();
//获得ISession实例
ISession session = nhibernateHelper.GetSession();
return session.CreateQuery("from Customer as c where c.NameAddress.CustomerName=:cn and c.NameAddress.CustomerAddress=:ca")
.SetString("cn", strCustomerName)
.SetString("ca", strAddress)
.List<Customer>();
}
查询名字为“wolfy”和地址为“北京 海淀”的客户信息
查看生成的sql
总结
通过组件可改变我们的对象模型,而数据库结构不需要变化。通过利用组件来映射依赖对象,可以非常连贯的引入NHibernate中的多表映射关系、集合等内容。参考文章:http://www.cnblogs.com/lyj/archive/2008/10/23/1317877.html
[NHibernate]组件之依赖对象的更多相关文章
- [转]NHibernate之旅(8):巧用组件之依赖对象
本节内容 引入 方案1:直接添加 方案2:巧用组件 实例分析 结语 引入 通过前面7篇的学习,有点乏味了~~~这篇来学习一个技巧,大家一起想想如果我要在Customer类中实现一个Fullname属性 ...
- NHibernate之旅(8):巧用组件之依赖对象
本节内容 引入 方案1:直接加入 方案2:巧用组件 实例分析 结语 引入 通过前面7篇的学习,有点乏味了~~~这篇来学习一个技巧.大家一起想想假设我要在Customer类中实现一个Fullname属性 ...
- 基于ABP模块组件与依赖注入组件的项目插件开发
注意,阅读本文,需要先阅读以下两篇文章,并且对依赖注入有一定的基础. 模块系统:http://www.cnblogs.com/mienreal/p/4537522.html 依赖注入:http://w ...
- NHibernate 组件基础 (第六篇)
NHibernate 组件基础 (第六篇) 一.组件简介 组件(Component)可以理解为被一个对象所包含的对象而持久化,而并非一个实体.简单说来,假如数据库有FirstName,LastName ...
- 在 WPF 中获取一个依赖对象的所有依赖项属性
原文:在 WPF 中获取一个依赖对象的所有依赖项属性 本文介绍如何在 WPF 中获取一个依赖对象的所有依赖项属性. 本文内容 通过 WPF 标记获取 通过设计器专用方法获取 通过 WPF 标记获取 p ...
- .Net组件程序设计之对象生命周期
.Net组件程序设计之对象生命周期 .NET 垃圾回收 IDisposable() Using语句 .NET 垃圾回收 是CLR管理着垃圾回收器,垃圾回收器监控着托管堆,而我们使用的对象以及系统启动是 ...
- WPF 依赖属性与依赖对象
在介绍依赖属性之前,我先介绍下属性的历史 属性的历史: 早期C++的类中,只有字段及方法,暴露数据靠的是方法, 但是字段直接暴露会不安全,所以才用方法来暴露,在设置的时候加些约束,在MFC中 ...
- vue validate多表单验证思考 之前写过一个里外层,现在觉得不合适,应该平行的写,然后都给ret,最后判断ret 再做出反应,这样整体表单的所有验证就都报验证,然后最后提交的时候把组件内的对象合并到总的对象,再提交
vue validate多表单验证思考 之前写过一个里外层,现在觉得不合适,应该平行的写,然后都给ret,最后判断ret 再做出反应,这样整体表单的所有验证就都报验证,然后最后提交的时候把组件内的对象 ...
- Qt Quick 组件与动态对象
博客24## 一.Components(组件) Component 是由 Qt 框架或开发者封装好的.只暴露了必要接口的 QML 类型,可以重复利用.一个 QML 组件就像一个黑盒子,它通过属性.信号 ...
随机推荐
- Zend Studio安装详解
本篇文章介绍Zend Stuido安装 PHP安装请参考 http://www.cnblogs.com/azhe-style/p/php_new_env_build.html 一.下载 百度Zend ...
- Source Insight常用功能设置
熟悉工具的使用能在一定程度上提高工作效率,但工具永远只是工具,大家要把重点放在内功的修炼上. 符号导航 符号(变量.宏定义.结构定义.枚举.函数等等)在SI 中的检索非常方便.Ctrl+鼠标左键或Ct ...
- Linux File Recovery Study
Background Today I did stupid things that I went into the ~/Downloads/ and pressed [Alt] + [A] then ...
- 2016.10.30 NOIP模拟赛 day2 AM 整理
题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分 2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...
- Bootstrap 按钮
本章将通过实例讲解如何使用 Bootstrap 按钮.任何带有 class .btn 的元素都会继承圆角灰色按钮的默认外观.但是 Bootstrap 提供了一些选项来定义按钮的样式,具体如下表所示: ...
- Hibernate双向多对多关联
一.配置双向多对多关联 以Project类(项目)和Emp类(员工)为例: 1.创建Project类,并需要定义集合类型的Emp属性 public class Project { //编号 priva ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- POJ3250[USACO2006Nov]Bad Hair Day[单调栈]
Bad Hair Day Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17774 Accepted: 6000 Des ...
- 2016第二届陕西省网络空间安全大赛WriteUp
2016年5月28号(正式比赛) 有选择题和实践题,俩队员在弄选择题时,我去拿了web1的一血. 0x01 web 是一道代码审计题,发包,返回了源代码: <?php if (isset($_G ...
- python-异常处理
一.异常 异常是什么? 就是影响程序正常执行的事件,异常在程序执行的过程中发生,脚本发生异常时,我们需要捕获它,否则程序就会终止. 异常处理: 1.捕获异常:try:...except ..... w ...