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文档中的例子:
NHibernate one-to-one的更多相关文章
- Nhibernate的Session管理
参考:http://www.cnblogs.com/renrenqq/archive/2006/08/04/467688.html 但这个方法还不能解决Session缓存问题,由于创建Session需 ...
- "NHibernate.Exceptions.GenericADOException: could not load an entity" 解决方案
今天,测试一个项目的时候,抛出了这个莫名其妙的异常,然后就开始了一天的调试之旅... 花了很长时间,没有从代码找出任何问题... 那么到底哪里出问题呢? 根据下面那段长长的错误日志: -- ::, ...
- nhibernate连接11g数据库
我框架的数据映射用 nhibernate连接多数据库,这次又增加了oracle11g,负责开发的同事始终连接不上,悲催的sharepoint调试是在不方便... 下面描述下问题的解决,细节问题有3个: ...
- 全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)
在开发涉及到数据库的程序时,常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况,这时就需要进行数据库迁移. 实现数据库迁移有很多种办法,从手动管理各个版本的ddl脚本,到实现自己的mig ...
- 跟我学习NHibernate (1)
引言:Nibernate概述 NHibernate是一个ORM框架,NHibernate是一个把C#对象世界和关系世界数据库之间联系起来的一座桥梁.NHibernate 能自动映射实体模型到数据库,所 ...
- 让OData和NHibernate结合进行动态查询
OData是一个非常灵活的RESTful API,如果要做出强大的查询API,那么OData就强烈推荐了.http://www.odata.org/ OData的特点就是可以根据传入参数动态生成Ent ...
- MVC Nhibernate 示例
首先,非常感谢提出问题的朋友们,使得本人又去深入研究了NHibernate的<Session-Per-Request 模式>. 前言: 谈到NHibernate大伙并不陌生,搞Java ...
- Nhibernate mapping 文件编写
生成工具软件 现在生成工具软件有很多了,例如商业软件:NMG.CodeSmith.Visual NHibernate,开源软件:MyGeneration.NHibernate Modeller.AjG ...
- NHibernate之映射文件配置说明
NHibernate之映射文件配置说明 1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表 ...
- NHibernate常见问题及解决方法
NHibernate常见问题及解决方法 曾经学过NHibernate的,但是自从工作到现在快一年了却从未用到过,近来要巩固一下却发现忘记了许多,一个"in expected: <end ...
随机推荐
- C和C++混合编程(__cplusplus 与 external "c" 的使用)
转自:http://blog.csdn.net/ljfth/article/details/3965871 第一种理解比如说你用C++开发了一个DLL库,为了能够让C语言也能够调用你的DLL输出(Ex ...
- PHP 部署发布接口
环境前提:电脑已安装wamp ① 在\wamp\bin\apache\apache2.4.9\conf\httpd.conf文件中, 修改 DocumentRoot 为当前项目路径,例如 Docume ...
- JNI数据类型(转)
本文原创,转载请注明出处:http://blog.csdn.net/qinjuning 在Java存在两种数据类型: 基本类型 和 引用类型 ,大家都懂的 . 在JNI的世界里也存在类似的数据类型,与 ...
- hdu 5833 Zhu and 772002 高斯消元
Zhu and 772002 Problem Description Zhu and 772002 are both good at math. One day, Zhu wants to test ...
- Servlet获取类路径下的资源
示例程序: package cn.yzu; import java.io.IOException; import java.io.InputStream; import javax.servlet.S ...
- 大端模式 VS 小端模式
简单点说,就是字节的存储顺序,如果数据都是单字节的,那怎么存储无所谓了,但是对于多字节数据,比如int,double等,就要考虑存储的顺序了.注意字节序是硬件层面的东西,对于软件来说通常是透明的.再说 ...
- java.util.List接口的方法subList()的使用注意事项
JDK中,List接口有一个实例方法List<E> subList(int fromIndex, int toIndex), 其作用是返回一个以fromIndex为起始索引(包含),以to ...
- css学习(1)-- 层叠样式表CSS的基础
一.什么是CSS CSS是Cascading Style Sheets的简写,它除了可以轻松设置网页元素的显示位置和格式处,甚至还能产生滤镜,图像淡化,网页淡入淡出的渐变效果. 一个样式表由样式规则组 ...
- 捕获异常try:except
常见的异常有:1.NameError 没有定义这个变量2.SyntaxError 这是语法错误3.IOEtror 这里是想打开的文件不存在4.10/0: ZeroDivsionertor 这个是除零错 ...
- SpringMVC解析4-DispatcherServlet逻辑脉络
HttpServlet提供了不同的服务方法,它们是doDelete(),doGet(),doOptions(),doPost(),doPut(),和doTrace(),它会根据不同的请求形式将程序引导 ...