NHibernate one-to-one

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"/>

分类: NHibernate

时间: 2024-07-28 13:03:56

NHibernate one-to-one的相关文章

[Nhibernate]Nhibernate系列之体系结构

引言 在项目中也有用到过nhibernate但对nhibernate的认识,也存留在会用的阶段,从没深入的学习过,决定对nhibernate做一个系统的学习. ORM 对象-关系映射(OBJECT/RELATION MAPPING,简称ORM),是随着面向对象的软件开发方法发展而产生的.面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统.对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据

NHibernate常见问题及解决方法

NHibernate常见问题及解决方法 曾经学过NHibernate的,但是自从工作到现在快一年了却从未用到过,近来要巩固一下却发现忘记了许多,一个"in expected: <end-of-text> (possibly an invalid or unmapped class name was used in the query)."错误查了好半天终于查到了.这篇文章是我转载的NHibernate的常见错误... hbm.xmlNHibernate文件中版本号可能引起的

Linq To Nhibernate 性能优化(入门级)

最近都是在用Nhibernate和数据库打交道,说实话的,我觉得Nhibernate比Ado.Net更好用,但是在对于一些复杂的查询Nhibernate还是比不上Ado.Net.废话不多说了,下面讲讲Linq To Nhibernate的性能优化. 第一点:应该要分清楚当前代码是在数据库上执行,还是在内存中执行(或者什么时候应该在数据库上做,什么时候应该在内存做) 我们在在做查询的时候,常见的使用方法 上面是使用了Iqueryable接口的,它会把数据先筛完了之后,再返回给我们 这个在数据库里呢

NHibernate框架与BLL+DAL+Model+Controller+UI 多层架构十分相似--『Spring.NET+NHibernate+泛型』概述、知识准备及介绍(一)

原文://http://blog.csdn.net/wb09100310/article/details/47271555 1. 概述 搭建了Spring.NET+NHibernate的一个数据查询系统.之前没用过这两个框架,也算是先学现买,在做完设计之 后花了一周搭建成功了.其中,还加上了我的一些改进思想,把DAO和BLL之中相似且常用的增删改查通过泛型T抽象到了DAO和BLL的父类中,其DAO 和BLL子类只需继承父类就拥有了这些方法.和之前的一个数据库表(视图)对应一个实体,一个实体对应一

使用NHibernate(10) -- 补充(inverse &amp;&amp; cascade)

1,inverse属性的作用: 只有集合标记(set/map/list/array/bag)才有invers属性: 以set为例,set的inverse属性决定是否把对set的改动反应到数据库中去,inverse=false(反应),inverse=true(不反应):默认值是false; one-to-many 和many-to-many都适用: inverse等于false时,对于one-to-many,如果删除"一"方,NH会先执行Update语句来把"多"方

[NHibernate]ISessionFactory配置

系列文章 [Nhibernate]体系结构 引言 在上篇文章学习了orm和nhibernate相关概念,这篇文章主要学习ISessionFactory如何配置. 因为NHibernate被设计为可以在许多不同环境下工作,所以它有很多配置参数.不过,大部分都已经有默认值了.NHibernate.Test.dll包含了一个示例的配置文件app.config,它演示了一些可变的参数. 可编程配置方式 NHibernate. Cfg.Configuration的一个实例代表了应用程序中所有的.Net类到

NHibernate VS IbatisNet

  NHibernate 是当前最流行的 Java O/R mapping 框架Hibernate 的移植版本,当前版本是 1.0 .2 .它出身于sf.net..IbatisNet 是另外一种优秀的 Java O/R mapping框架,当前版本是 1.2 .目前属于 apache 的一个子项目了. 相对 NHibernate " O/R "而言, IbatisNet 是一种" Sql Mapping "的 ORM实现.NHibernate 对数据库结构提供了较为

NHibernate连接oracle报错

NHibernate.Exceptions.GenericADOException:“could not execute query [ select sys_user0_.USERID as USERID1_0_, sys_user0_.LOGINNAME as LOGINN2_0_, sys_user0_.LOGINPASSWORD as LOGINP3_0_, sys_user0_.DEPTID as DEPTID4_0_, sys_user0_.REALNAME as REALNA5_0

MVC+Spring.NET+NHibernate .NET SSH框架整合

在JAVA中,SSH框架可谓是无人不晓,就和.NET中的MVC框架一样普及.作为一个初学者,可以感受到.NET出了MVC框架以后太灵活了(相比之前的web Form),嗯,关于.NET中的MVC框架我就不多说了,推荐这位大神的<MVC知多少系列>http://www.cnblogs.com/sheng-jie/p/6291915.html.下面进入正题,.NET中也有SSH框架,他们分别指MVC+Spring.NET和NHibernate. 其中Spring.NET是典型的IOC框架,类似的还

NHibernate官方文档中文版--基础ORM(Basic O/R Mapping)

映射声明 对象/关系映射在XML文件中配置.mapping文件这样设计是为了使它可读性强并且可修改.mapping语言是以对象为中心,意味着mapping是围绕着持久化类声明来建立的,而不是围绕数据表. 要注意的是,尽管很多NHibernate使用者选择手动定义XML文件,但是仍然有很多工具可以用来生成mapping文件,包括NHibernate.Mapping.Attributes 库和各种各样基于模板的代码生成工具(CodeSmith, MyGeneration). 让我们用一个mappin