NHibernate中一对一关联的延迟加载
2012-12-24 09:38
211 查看
由于项目需要,我最近对.NET平台下各ORM框架(LINQ to SQL、Entity Framework V2 & V4、以及NHibernate)进行了功能对比,NHiberante可以说是各框架之中历史最为悠久,功能最强,也是使用最为复杂的一个。在使用NHibernate的过程中也遇到了许多麻烦,不过也得到了不少体会。例如NH的不足之处,我理想中的ORM框架是怎么样的,等等这些,以后有机会也可以慢慢和各位进行讨论。
不过这篇文章谈论的其实只是一个小技巧,一个workaround,而且甚至于这个是由于我对NHibernate不够了解而造成的。因此,如果您有更好的做法也请不吝指出。这个问题也就是“如何实现NHibernate中一对一映射的延迟加载”。
问题描述
之前对于问题的描述,其实还有很多额外的要求没有讲清楚,而需要“workaround”的现状,也是这些要求共同形成的。经过尝试,如果放弃其中任何一个(如把主表ID的生成策略从identity改为native),则可能就会有更直接的做法了。这些条件是:
一对一映射
主键关联
主表的ID为自增字段
所有字段NOT NULL。
主表和子表设置级联删除
现在的问题,就是在这些条件下,如何实现“获取主表对象时,并不加载其对应的子表数据”,也就是所谓的“延迟加载”。当然,除了能够“延迟加载”以外,还必须可以插入,更新和删除——我也尝试过使用某些特殊的映射方式,可以实现延迟加载,但是却无法插入,这自然也无法满足要求。
为了便于理解和实验,我在这里也将其“具体化”。首先是Model,User和UserDetail,它们是典型的一对一关系:
不过这篇文章谈论的其实只是一个小技巧,一个workaround,而且甚至于这个是由于我对NHibernate不够了解而造成的。因此,如果您有更好的做法也请不吝指出。这个问题也就是“如何实现NHibernate中一对一映射的延迟加载”。
问题描述
之前对于问题的描述,其实还有很多额外的要求没有讲清楚,而需要“workaround”的现状,也是这些要求共同形成的。经过尝试,如果放弃其中任何一个(如把主表ID的生成策略从identity改为native),则可能就会有更直接的做法了。这些条件是:
一对一映射
主键关联
主表的ID为自增字段
所有字段NOT NULL。
主表和子表设置级联删除
现在的问题,就是在这些条件下,如何实现“获取主表对象时,并不加载其对应的子表数据”,也就是所谓的“延迟加载”。当然,除了能够“延迟加载”以外,还必须可以插入,更新和删除——我也尝试过使用某些特殊的映射方式,可以实现延迟加载,但是却无法插入,这自然也无法满足要求。
为了便于理解和实验,我在这里也将其“具体化”。首先是Model,User和UserDetail,它们是典型的一对一关系:
相关文章推荐
- NHibernate中一对一关联的延迟加载
- NHibernate中一对一关联的延迟加载
- NHibernate OneToOne 映射下使用延迟加载
- Hibernate中的延迟加载、实体关联单向一对多及双向一对多实体关联
- 一对一延迟加载问题探讨
- mybatis多表关联查询 - N+1次查询+延迟加载
- hibernate实体及集合属性、关联实体的延迟加载
- 使用NHibernate(8)-- 延迟加载
- [转]NHibernate之旅(12):初探延迟加载机制
- NHibernate延迟加载
- NHibernate延迟加载与立即加载
- hibernate设置延迟加载后获得关联对象报错的解决方案
- JPA中的一对多双向关联、级联操作、关系维护、延迟加载
- 【EF学习笔记06】----------加载关联表的数据 延迟加载
- Hibernate学习26 -- 延迟加载3 -- 关联lazy特征
- JPA中的多对多双向关联、级联操作、关系维护、延迟加载
- 艾伟_转载:我对NHibernate的感受(1):对延迟加载方式的误解
- NHibernate:延迟加载方式
- NHibernate之旅(12):初探延迟加载机制[转 Blog 李永京]