NHibernate里面one-to-one有两种方式:主键关联和唯一外健关联

主键关联:
两个表拥有相同的主键字段,值相同的关联在一起。典型的应用是一个对象的属性太多,将常用的属性跟不常用的附加属性分开存放,或者按照业务分类存放、维护,例如物料的通用属性、财务属性、采购属性、生产制造属性。因为表示的是同一个对象,所以它们的生命周期是相同的。但一般会有一个主从关系,因为通常我们会将其中的一个主表跟对象直接映射,其它的做为附属。

唯一外健关联:
两个表拥有独立的主键字段(实体id),一个表用外键关联另外一个表。其实就是将一个one-to-many的表结构设计当作one-to-one的方式使用。
拥有独立的实体id,通常意味着对象的生命周期是独立的,需要的时候可以建立起one-to-one的关系,分开之后仍独立存在。例如夫妻关系(假设一夫一妻制),士兵跟枪的关系(假设一个士兵只配备一支枪)。

主键关联示例:

<class name="BoxDao" table="CMS_BOX">
    <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>
public class BoxDao
{
    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; }
    }
}

<class name="WrapperParamDao" table="CMS_WRAPPER_PARAM">
    <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>
public class WrapperParamDao
{
    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的属性值。如果是同时新增这两个对象,更需要注意:

box.WrapperParam = 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文档中的例子:

<many-to-one name="Person" class="Person" column="PERSON_ID" unique="true"/>
<one-to-one name="Employee" class="Employee" property-ref="Person"/>

转载于:https://www.cnblogs.com/RicCC/archive/2007/08/14/NHibernate-one-to-one.html

NHibernate one-to-one相关推荐

  1. Simple NHibernate Architecture[from]

    原文地址:http://www.codeproject.com/aspnet/NHibernateArchitecture.asp Download source - 2,523.7 KB Intro ...

  2. NHibernate从入门到精通系列(7)——多对一关联映射

    内容摘要 多对一关联映射概括 多对一关联映射插入和查询 多对一关联映配置介绍 一.多对一关联映射概括 关联关系是实体类与实体类之间的结构关系,分别为"多对一"."一对一& ...

  3. NHibernate初学体验记

    NHibernate 是一个基于.Net 的针对关系型数据库的对象持久化类库.NHibernate 来源于优秀的基于Java的关系型持久化工具Hibernate.NHibernate持久化你的.Net ...

  4. ActiveRecordBase借助NHibernate的条件获取实体类对象

    ActiveRecordBase.FindAll() 函数其中有一个这样的版本的参数 ActiveRecordBase.FindAll(TargetType As System.Type,Orders ...

  5. 未能从程序集 XX加载类型XXX的错误解决方法(借以提醒NHibernate使用者)

    这是写.hbm.xml文件最容易犯的错误之一 首先,Class的Name属性必须是"完全限定类名,程序集名" 这里,例如 <class name="ibiz.cor ...

  6. ORM武器:NHibernate(三)五个步骤+简单对象CRUD+HQL

    前面的两篇文章中.我们对NHibernate已经做了大致了解 <ORM利器:NHibernate(一)简单介绍>Nhibernate的作用:攻克了对象和数据库的转化问题 <ORM利器 ...

  7. [NHibernate]代码生成器的使用

    目录 写在前面 文档与系列文章 代码生成器的使用 总结 写在前面 前面的文章介绍了nhibernate的相关知识,都是自己手敲的代码,有时候显得特别的麻烦,比如你必须编写持久化类,映射文件等等,举得例 ...

  8. NHibernate和Cuyahoga(二)(翻译):

    原文:http://www.cuyahoga-project.org/home/developers.aspx Mappings: 在我们使用像NHibernate这样强大的ORM工具的时候,映射类有 ...

  9. NHibernate之旅(11):探索多对多关系及其关联查询

    本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型 ...

  10. 测试 ClownFish、CYQ、Entity Framework、Moon、MySoft、NHibernate、PDF、XCode数据访问组件性能...

    下期预告: 由于很多园友反馈,有的组件不应该缺席.测试复杂度不够.测试还缺乏一定的公平. 因此考虑在下一个版本中,确保在更加公平的前提下进行更高复杂度的测试 . 同时将分为2组测试,纯SQL组件及纯O ...

最新文章

  1. 如何从无到有搭建to B平台?
  2. SSH实战项目——在线商品拍卖网
  3. Go单元测试--模拟服务请求和接口返回
  4. linux java ssl_linux系统下安装ssl证书(tomcat)
  5. 加快linux编译速度,Linux Makefile 编译速度的优化【转】
  6. 付款更方便了?腾讯接入!微信支持数字人民币支付
  7. Linux IPC POSIX 共享内存
  8. 使用Ant定义生成文件
  9. node-js由浅入深教程
  10. 开发落网电台windows phone 8应用的计划(9)
  11. iOS - AVAudioSession详解
  12. STM32 实现光敏传感器
  13. 【Unity】制作圆形进度条
  14. win10u盘被写保护怎么解除_win10系统下u盘被写保护怎么解除_win10解除u盘写保护方法...
  15. 【蓝桥杯嵌入式】【HAL库】九、DAC实验
  16. 【ORACLE】关于多态表函数PTF(Polymorphic Table Functions)的使用
  17. C++中endl、ends和flush作用:
  18. 湘潭大学java实验
  19. 施乐3030工程机驱动安装
  20. 气象预警信号图标设计中的坑

热门文章

  1. 被Facebook终止合作,被谷歌下架,股价营收皆腰斩,猎豹只剩AI一根救命稻草了...
  2. Fiddler (三) Composer创建和发送HTTP Request
  3. Django重新整理
  4. JavaScript内存优化
  5. web框架flask(12)——国际化和本地化
  6. Rabbitmq基本框架和安装(1)
  7. [TypeScript] Using Interfaces to Describe Types in TypeScript
  8. 用户和用户组的简单总结
  9. html缩进快捷键_Mac技巧|如何高效使用苹果便笺?利用便笺快捷键快速完成操作!
  10. C 语言编程 — 指令行参数