庆祝NH3 GA Released 兼思考两个问题的解决方案
2010-12-05 14:39
246 查看
庆祝NHibernate 3.0 GA 正式发布。内牛满面...
同时,基于现有的一些需求,思考两个问题;思考而已,还没有时间测试:
问题1:
背景:某系统,所有的数据采用软删除,即,实体中都有一个属性,如RecordStatus = 0时,代表数据为正常状态;等于1时代表数据为已删除。于是在实体的hbm文件中添加where="RecordStatus = 0 OR RecordStatus IS NULL"。
问题场景:在某些特定场合,需要加载RecordStatus <> 0 的数据。
可能解决方案:最直接的设想,当然是在需要加载RecordStatus <> 0的数据的场景下动态地Disable配置中的where condition. 但经过研究,发现这个方法不可行,因为当SessionFactory创建完毕后,配置中的内容不可更改(尚待更进一步的测试)。替代方案是在有这个需要的场景之下,重新创建SessionFactory,并且采用不包含where condition的配置文件。然后再用这个SessionFactory来创建Session。在3.0中,可以这么做:
http://www.primordialcode.com/blog/post/modify-nhibernate-mappings-runtime
2.x可以这么做:
http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/04/28/create-and-update-database-schema.aspx
http://stackoverflow.com/questions/702195/adding-an-nhibernate-mapping-at-run-time
(顺便记下,读取配置信息:http://stackoverflow.com/questions/281095/nhibernate-accessing-configuration-properties-sql-dialect-at-runtime)
当然这种解决方案是以性能为代价的,因为创建SessionFactory是个重体力活,据说耗时约1秒。
另一个可能可行的方案,有待测试:
用Interceptor。监听PreLoad事件,在此事件中做特殊处理。
当然,最肯定能解决问题的方案就是不要加这个where condition,然后在所有的使用到的场景中动态地添加适当的过滤条件。
还有一个办法,就是需要加载的时候,添加OR RecordStatus =1 的条件,这样既可绕开。有待测试.
2010-12-12 最终结论:无法绕开。但是这样的场景可以把where用filter替代。
问题2: Lazy load property.
例如,某表某列数据庞大,我们希望在默认情况下都不加载此列。在3.0下,这个可以做到了:
http://ayende.com/Blog/archive/2010/01/27/nhibernate-new-feature-lazy-properties.aspx
当然,这里的问题是文章里提到了怎样用Query来明确获取所有的Lazy Properties,但也说明了无法精确控制特定Property,也无法通过Criteria来获取Lazy Properties。当然这是2010/01/27的文章,当前正式版本的真实情况如何,有待研究。
另外,此文章的回复中,提到了用ExludeProperty方法来做类似的事情。诚然,这个方法需要每次动态地去指定,而非“默认”不加载的概念。
http://efreedom.com/Question/1-3669164/NHibernate-ExcludeProperty-IncludeProperty
上面说了一个挺有意思的IncludeProperty的实现,记下,可参考。
而这个的回复提到的东西有空试试:
http://efreedom.com/Question/1-2464116/Dynamically-Modify-NHibernate-Load-Queries-Runtime-EventListeners-Interceptors
同时,基于现有的一些需求,思考两个问题;思考而已,还没有时间测试:
问题1:
背景:某系统,所有的数据采用软删除,即,实体中都有一个属性,如RecordStatus = 0时,代表数据为正常状态;等于1时代表数据为已删除。于是在实体的hbm文件中添加where="RecordStatus = 0 OR RecordStatus IS NULL"。
问题场景:在某些特定场合,需要加载RecordStatus <> 0 的数据。
可能解决方案:最直接的设想,当然是在需要加载RecordStatus <> 0的数据的场景下动态地Disable配置中的where condition. 但经过研究,发现这个方法不可行,因为当SessionFactory创建完毕后,配置中的内容不可更改(尚待更进一步的测试)。替代方案是在有这个需要的场景之下,重新创建SessionFactory,并且采用不包含where condition的配置文件。然后再用这个SessionFactory来创建Session。在3.0中,可以这么做:
http://www.primordialcode.com/blog/post/modify-nhibernate-mappings-runtime
2.x可以这么做:
http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/04/28/create-and-update-database-schema.aspx
http://stackoverflow.com/questions/702195/adding-an-nhibernate-mapping-at-run-time
(顺便记下,读取配置信息:http://stackoverflow.com/questions/281095/nhibernate-accessing-configuration-properties-sql-dialect-at-runtime)
当然这种解决方案是以性能为代价的,因为创建SessionFactory是个重体力活,据说耗时约1秒。
另一个可能可行的方案,有待测试:
用Interceptor。监听PreLoad事件,在此事件中做特殊处理。
当然,最肯定能解决问题的方案就是不要加这个where condition,然后在所有的使用到的场景中动态地添加适当的过滤条件。
还有一个办法,就是需要加载的时候,添加OR RecordStatus =1 的条件,这样既可绕开。有待测试.
2010-12-12 最终结论:无法绕开。但是这样的场景可以把where用filter替代。
问题2: Lazy load property.
例如,某表某列数据庞大,我们希望在默认情况下都不加载此列。在3.0下,这个可以做到了:
http://ayende.com/Blog/archive/2010/01/27/nhibernate-new-feature-lazy-properties.aspx
当然,这里的问题是文章里提到了怎样用Query来明确获取所有的Lazy Properties,但也说明了无法精确控制特定Property,也无法通过Criteria来获取Lazy Properties。当然这是2010/01/27的文章,当前正式版本的真实情况如何,有待研究。
另外,此文章的回复中,提到了用ExludeProperty方法来做类似的事情。诚然,这个方法需要每次动态地去指定,而非“默认”不加载的概念。
http://efreedom.com/Question/1-3669164/NHibernate-ExcludeProperty-IncludeProperty
上面说了一个挺有意思的IncludeProperty的实现,记下,可参考。
而这个的回复提到的东西有空试试:
http://efreedom.com/Question/1-2464116/Dynamically-Modify-NHibernate-Load-Queries-Runtime-EventListeners-Interceptors
相关文章推荐
- LeetCode Single Number I & II 都符合两个问题额外要求的 通用解法 与 思考过程
- 或许你从小就一直在思考的两个算术问题
- 工作中遇到的问题:百万条数据的查询、删除、修改效率提高的一些思考,解决方案(一)
- 关于CSS中的居中问题的思考及解决方案
- 普通PC安装ESXi 5.5的两个问题的解决方案
- c语言:用getchar函数读入两个字符给c1,c2,用putchar和printf输出。思考问题
- 阿里2016产品笔试主观题,值得初学者思考的两个小问题
- 由“类的成员函数”充当“回调函数”引发的问题的思考和解决方案
- VS2010的两个问题--右键菜单过长及Ctrl+F窗口宽度不断增大而且出现位置不一致--解决方案
- 对于 分布式下session同步问题 解决方案的思考
- 《ASP.NET2.0揭秘》读书笔记——构建自定义控件前你必须思考的两个问题
- 乔布斯成功的简单秘方,坚持思考两个问题
- 关于SSO配置的两个问题的解决方案
- pcel安装的mongodb的两个问题的解决方案
- LeetCode Single Number I & II 都符合两个问题额外要求的 通用解法 与 思考过程
- 两个多线程笔试问题引发的思考
- 最近常常思考的关于测试的两个问题
- 基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
- DedeCMS关键词替换(两个相似关键词)问题较完美解决方案
- 通过细心思考解决看似简单的问题(java求两个int值的平均数)