首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

NHibernate:如何在一对一映射上启用延迟加载

在NHibernate中,要在一对一映射上启用延迟加载,您需要遵循以下步骤:

  1. 在映射类中定义关系:

在您的映射类中,您需要定义一个一对一关系。例如,如果您有一个Person类和一个Address类,您可以在Person类中定义一个Address属性。

代码语言:csharp
复制
public class Person
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual Address Address { get; set; }
}

public class Address
{
    public virtual int Id { get; set; }
    public virtual string Street { get; set; }
    public virtual string City { get; set; }
    public virtual string State { get; set; }
    public virtual string Zip { get; set; }
}
  1. 在映射文件中配置一对一映射:

接下来,您需要在映射文件中配置一对一映射。在此示例中,我们将在Person.hbm.xml文件中配置映射。

代码语言:xml<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
复制
 <class name="Person" table="persons">
    <id name="Id">
     <generator class="identity" />
    </id>
   <property name="Name" />
    <one-to-one name="Address" class="Address" cascade="all" lazy="proxy" />
  </class>
</hibernate-mapping>

在此配置中,lazy属性设置为proxy,这意味着NHibernate将使用延迟加载来获取Address对象。

  1. 使用延迟加载获取数据:

现在,您可以使用NHibernate的ISession对象来查询Person对象并访问其Address属性。当您访问Address属性时,NHibernate将自动加载该属性,而不是立即加载整个对象。

代码语言:csharp
复制
using (var session = sessionFactory.OpenSession())
{
    using (var transaction = session.BeginTransaction())
    {
        var person = session.Get<Person>(1);
        var address = person.Address;
        transaction.Commit();
    }
}

在这个例子中,当您访问person.Address时,NHibernate将自动加载Address对象,而不是立即加载整个对象。这就是在NHibernate中为一对一映射启用延迟加载的方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Fluent NHibernate之旅(四)-- 关系(上)

这是我们简单的一个一对一的设计,我们先只要求实现映射,至于其他的比如延迟加载的,稍后说。先跑起来溜溜。...我们的一对一简单映射也说完了,同时也完成了Component的映射,接下来说说延迟加载 一对一延迟加载 细心的朋友一定会发现我们的output出来的Sql语句,使用的是联合查询,但有时对我们来说,只需要...(); 虽然Fluent支持,虽然编译通过,但在创建ISessionFactory的时候,却会抛出异常,因为NHibernate不支持one-to-one的Lazy的特性,也就是说NHibernate不支持一对一延迟加载...,但结果只是分了2条Sql语句进行的查询,并不是延迟加载,这一点可以通过Sql Server Profiler查看: ?...NHibernate是不支持one-to-one的延迟加载的,我也不知道为什么,但我们可以婉转的进行延迟加载,老赵已经在他的文章“NHibernate一对一关联的延迟加载”中提出了解决方案,大家可以看一下

1.2K60

Fluent NHibernate之旅(四)-- 关系(中)

Fluent NHibernate之旅系列导航: 一、开篇:ISessionFactory Configuration 二、实体映射:Entity Mapping 三、继承映射:Inheritence...Mapping 四、一对一映射:One-to-One Mapping 场景和数据库设计 延续我们的演示范例,用户和订单是非常典型的一对多范例。...1、一个用户可以拥有多个订单 2、一个订单只能拥有一个用户 对于用户来说,不需要每次都加载订单列表,反之订单可能每次都需要加载用户信息。Let's Go: ?...一对多的映射,比起一对一来说还相对的简单点,默认是延迟加载,如果项目中,有些地方,需要立即加载,我们也可以使用 FetchMode.Eager 来加载。...我们在Output中,能看到NHibernate生成的Sql语句,测试也成功,说明我们刚刚是立即加载了Orders属性。

690100

C# 数据操作系列 - 12 NHibernate的增删改查

前言 上一篇《C# 数据操作系列 - 11 NHibernate 配置和结构介绍》 介绍了Nhibernate里的配置内容。这一篇将带领大家了解一下如何使用NHIbernate。...不过,有社区爱好者开发了一个名为《Fluent NHibernate》的项目,用来支持NHibernate的流式配置。...,默认情况从Property 中读取 default-lazy:可选的,默认是true,是否启动延迟加载 1.2 class的配置 一般情况下,class节点只需要指定name和table就可以了。...class="ManyClass" column="Column" > 1.2.4 one-to-one 一对一的关系与多对一的关系比较相似...,不同的地方在于一对一需要在双方的映射关系里均要维护,在有外键的表/实体中 添加 constrained=“true”。

1.1K20

Fluent NHibernate之旅(四)-- 关系(下)

一、开篇:ISessionFactory Configuration 二、实体映射:Entity Mapping 三、继承映射:Inheritence Mapping 四、一对一映射:One-to-One...Mapping 五、一对多映射:One-to-Many Mapping 场景和数据库设计 前两篇我们介绍了“一对一”和“一对多(多对一)”,或许前两种用的比较多,但多对多的关系,有时候我们也会遇到,...这里说一下,订单对于产品来说,不一定需要知道,也或者可以不需要一起加载,所以可以用延迟加载或者不加载,而产品对于订单来说,应该是需要立即加载,从而知道订单中所有的商品。...Product> Products { get; set; } //order other Property } 映射 如果大家先前几篇都看过的话,我觉得应该没有任何问题了,因为Fluent NHibernate

675100

『互联网架构』软件架构-mybatis体系结构(16)

写sql语句本身就是很繁琐的事情,ORM的出现对象关系映射,数据库里面的二维和java里面的bean,做一对一的配置。根本就不需要写sql语句了,后来开始普及hibernate。...3.4 设置sql参数 3.5 执行sql 3.6 释放链接 提交事务 hibernate虽然好,但是也有弊端的,最不方便的地方,状态的把握(游离态,持久化态,瞬态数据态),特别是模型比较复杂的时候什么一对一...谢而非完整的ORM,需要自己编写sql 语句,这是其优点也是缺点。...• delete – 映射删除语句 • resultMap 用来描述如何从数据库结果集中来加载对象。 • cache – 给定命名空间的缓存配置。...delete> 标签 将重复的sql 语句定文为一个字段 id,user_name,nick_name 可通过 进行引入

1.7K21

Java面试专题之九:Mybatis面试5个大概率被问到的问题

5、Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?...Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加 载,association 指的就是一对一,collection 指的就是一对多查询。...在 Mybatis配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false。...那么就会单独发送事先保存好的查询关联 B 对象的 sql,把 B 查询上来,然后调用 a.setB(b),于是 a 的对象 b 属性就有值了,接着完成 a.getB().getName()方法的调用,这就是延迟加载的基本原理...当然了,不光是 Mybatis,几乎所有的包括 Hibernate,支持延迟加载的原理都是一样的。 我是一名码龄10年的程序员,在这里会分享实在干货,让你少走弯路,成就精彩人生。

46230

一对一直播源码系统开发的终极密码,深度揭秘

5G网络即将覆盖普及, 一对一直播源码的未来可以说会更具潜力,近些年来一对一直播行业的发展迅猛,更多的人开始通过一对一直播平台社交网络来寻找娱乐,打发茶余饭后的时间。...今天我们一起来看下,一对一直播源码的开发密码是什么? 流媒体的传输 1、在一对一直播源码的开发中,音视频数据一定是从采集开始的,采集到的原始数据需要经过前处理,并且编码压缩后才能进行传输。...3、在一对一直播源码中,封装完成后的数据会在RTMP传输协议下进行发送,在这个环节中,传输协议的不同可能需要不同的音视频封装格式,为了保证用户的音视频聊天体验,要做好权衡调整。...6、安卓、iOS前端和后台数据要打通 其实最难的难点是提高首播时间、服务质量即如何在丢包率20%的情况下还能保障稳定、流畅的直播体验,需要考虑以下方案: 1.为加快首播时间,收流服务器主动推送GOP :...(Group of Pictures:策略影响编码质量)所谓GOP,意思是画面组,一个GOP就是一组连续的画面至边缘节点,边缘节点缓存 GOP,播放端则可以快速加载,减少回源延迟

31520

面试官:请讲一下MyBatis是如何关联关系?

column:指定表中对应的字段 javaType:指定映射到实体对象属性的类型 select:指定引入嵌套查询的子SQL语句,该属性用于关联映射中的嵌套查询 fetchType:指定在关联查询时是否启用延迟加载...该属性有lazy和eager两个属性值,默认值为lazy(即默认关联映射延迟加载) MyBatis加载关联关系对象主要通过两种方式:嵌套查询和嵌套结果。...多学一招:MyBatis延迟加载的配置 使用MyBatis的延迟加载在一定程度上可以降低运行消耗并提高查询效率。...MyBatis默认没有开启延迟加载,需要在核心配置文件中的元素内进行配置,具体配置方式如下: <setting name="...,即默认属性fetchType="lazy"(属性fetchType="eager"表示立即加载),所以在配置文件中开启延迟加载后,无需在映射文件中再做配置。

66120

Java 最常见的 208 道面试题:第十三模块答案

129. mybatis 是否支持延迟加载延迟加载的原理是什么?...Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。...在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。...这就是延迟加载的基本原理。 当然了,不光是Mybatis,几乎所有的包括Hibernate,支持延迟加载的原理都是一样的。 130. 说一下 mybatis 的一级缓存和二级缓存?...二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源, Ehcache。

50130
领券