NHibernate one-to-one
主键关联:
两个表拥有相同的主键字段,值相同的关联在一起。典型的应用是一个对象的属性太多,将常用的属性跟不常用的附加属性分开存放,或者按照业务分类存放、维护,例如物料的通用属性、财务属性、采购属性、生产制造属性。因为表示的是同一个对象,所以它们的生命周期是相同的。但一般会有一个主从关系,因为通常我们会将其中的一个主表跟对象直接映射,其它的做为附属。
唯一外健关联:
两个表拥有独立的主键字段(实体id),一个表用外键关联另外一个表。其实就是将一个one-to-many的表结构设计当作one-to-one的方式使用。
拥有独立的实体id,通常意味着对象的生命周期是独立的,需要的时候可以建立起one-to-one的关系,分开之后仍独立存在。例如夫妻关系(假设一夫一妻制),士兵跟枪的关系(假设一个士兵只配备一支枪)。
主键关联示例:
<id name="BoxId" >
<column name="BOX_ID" sql-type="NUMBER(8,0)" not-null="true"/>
<generator class="assigned" />
</id>
<one-to-one name="WrapperParam" lazy="proxy" cascade="all" />
</class>
{
private int _boxId;
private WrapperParamDao _wrapperParam;
public BoxDao()
{
}
public virtual int BoxId
{
get { return this._boxId; }
set { this._boxId = value; }
}
public virtual WrapperParamDao WrapperParam
{
get { return this._wrapperParam; }
set { this._wrapperParam = value; }
}
}
<id name="BoxId" >
<column name="BOX_ID" sql-type="NUMBER(8,0)" not-null="true"/>
<generator class="foreign">
<param name="property">Box</param>
</generator>
</id>
<one-to-one name="Box" constrained="true" cascade="none" />
</class>
{
private int _boxId;
private BoxDao _box;
public WrapperParamDao()
{
}
public virtual int BoxId
{
get { return this._boxId; }
set { this._boxId = value; }
}
public virtual BoxDao Box
{
get { return this._box; }
set { this._box = value; }
}
}
WrapperParamDao的配置中,<generator class="foreign">指示NHibernate在保存的时候,通过Box属性获取BoxId的值。constrained="true"相当于指定了one-to-one的关联方向,它会影响到Save()、Delete()操作的顺序。
保存WrapperParamDao时需要确保Box属性的有效性,否则将无法获取BoxId值;同样保存BoxDao是要确保WrapperParam的属性值。如果是同时新增这两个对象,更需要注意:
wrapperParam.Box = box;
session.Save(box);
如果<generator class="foreign">配置不当,或者保存时属性没有设置,将会报错"Unexpected row count: 0; expected: 1"之类:
Unexpected row count: 0; expected: 1
at NHibernate.AdoNet.Expectations.BasicExpectation.VerifyOutcomeNonBatched(Int32 rowCount, IDbCommand statement)
at NHibernate.Impl.NonBatchingBatcher.AddToBatch(IExpectation expectation)
at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Object[] oldFields, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session)
at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, Object[] oldFields, Object oldVersion, Object obj, ISessionImplementor session)
at NHibernate.Impl.ScheduledUpdate.Execute()
at NHibernate.Impl.SessionImpl.Execute(IExecutable executable)
at NHibernate.Impl.SessionImpl.ExecuteAll(IList list)
at NHibernate.Impl.SessionImpl.Execute()
at NHibernate.Impl.SessionImpl.Flush()
at NHibernate.Transaction.AdoTransaction.Commit()
唯一外健关联:
NHibernate文档中的例子:
转载于:https://www.cnblogs.com/RicCC/archive/2007/08/14/NHibernate-one-to-one.html
NHibernate one-to-one相关推荐
- Simple NHibernate Architecture[from]
原文地址:http://www.codeproject.com/aspnet/NHibernateArchitecture.asp Download source - 2,523.7 KB Intro ...
- NHibernate从入门到精通系列(7)——多对一关联映射
内容摘要 多对一关联映射概括 多对一关联映射插入和查询 多对一关联映配置介绍 一.多对一关联映射概括 关联关系是实体类与实体类之间的结构关系,分别为"多对一"."一对一& ...
- NHibernate初学体验记
NHibernate 是一个基于.Net 的针对关系型数据库的对象持久化类库.NHibernate 来源于优秀的基于Java的关系型持久化工具Hibernate.NHibernate持久化你的.Net ...
- ActiveRecordBase借助NHibernate的条件获取实体类对象
ActiveRecordBase.FindAll() 函数其中有一个这样的版本的参数 ActiveRecordBase.FindAll(TargetType As System.Type,Orders ...
- 未能从程序集 XX加载类型XXX的错误解决方法(借以提醒NHibernate使用者)
这是写.hbm.xml文件最容易犯的错误之一 首先,Class的Name属性必须是"完全限定类名,程序集名" 这里,例如 <class name="ibiz.cor ...
- ORM武器:NHibernate(三)五个步骤+简单对象CRUD+HQL
前面的两篇文章中.我们对NHibernate已经做了大致了解 <ORM利器:NHibernate(一)简单介绍>Nhibernate的作用:攻克了对象和数据库的转化问题 <ORM利器 ...
- [NHibernate]代码生成器的使用
目录 写在前面 文档与系列文章 代码生成器的使用 总结 写在前面 前面的文章介绍了nhibernate的相关知识,都是自己手敲的代码,有时候显得特别的麻烦,比如你必须编写持久化类,映射文件等等,举得例 ...
- NHibernate和Cuyahoga(二)(翻译):
原文:http://www.cuyahoga-project.org/home/developers.aspx Mappings: 在我们使用像NHibernate这样强大的ORM工具的时候,映射类有 ...
- NHibernate之旅(11):探索多对多关系及其关联查询
本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型 ...
- 测试 ClownFish、CYQ、Entity Framework、Moon、MySoft、NHibernate、PDF、XCode数据访问组件性能...
下期预告: 由于很多园友反馈,有的组件不应该缺席.测试复杂度不够.测试还缺乏一定的公平. 因此考虑在下一个版本中,确保在更加公平的前提下进行更高复杂度的测试 . 同时将分为2组测试,纯SQL组件及纯O ...
最新文章
- 如何从无到有搭建to B平台?
- SSH实战项目——在线商品拍卖网
- Go单元测试--模拟服务请求和接口返回
- linux java ssl_linux系统下安装ssl证书(tomcat)
- 加快linux编译速度,Linux Makefile 编译速度的优化【转】
- 付款更方便了?腾讯接入!微信支持数字人民币支付
- Linux IPC POSIX 共享内存
- 使用Ant定义生成文件
- node-js由浅入深教程
- 开发落网电台windows phone 8应用的计划(9)
- iOS - AVAudioSession详解
- STM32 实现光敏传感器
- 【Unity】制作圆形进度条
- win10u盘被写保护怎么解除_win10系统下u盘被写保护怎么解除_win10解除u盘写保护方法...
- 【蓝桥杯嵌入式】【HAL库】九、DAC实验
- 【ORACLE】关于多态表函数PTF(Polymorphic Table Functions)的使用
- C++中endl、ends和flush作用:
- 湘潭大学java实验
- 施乐3030工程机驱动安装
- 气象预警信号图标设计中的坑
热门文章
- 被Facebook终止合作,被谷歌下架,股价营收皆腰斩,猎豹只剩AI一根救命稻草了...
- Fiddler (三) Composer创建和发送HTTP Request
- Django重新整理
- JavaScript内存优化
- web框架flask(12)——国际化和本地化
- Rabbitmq基本框架和安装(1)
- [TypeScript] Using Interfaces to Describe Types in TypeScript
- 用户和用户组的简单总结
- html缩进快捷键_Mac技巧|如何高效使用苹果便笺?利用便笺快捷键快速完成操作!
- C 语言编程 — 指令行参数