您的位置:程序门 -> .net技术 -> c#



如何在nhibernate中使用setfetchmode=fetchmode.lazy


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


如何在nhibernate中使用setfetchmode=fetchmode.lazy
发表于:2007-05-31 16:31:54 楼主
最近在研究nhibernate,但是在执行setfetchmode=fetchmode.lazy时候碰到些问题。
我使用的是nhibernate1.2.0.ga,在它自带的nhibernate.examples-2.0中,将customer类的映射文件customer.hbm.xml中设置 <set   name= "orders "   inverse= "true "   table= "cas_order "   lazy= "false "> ,
然后,用以下语句进行提取操作
ilist   customer   =   session.createcriteria(typeof(customer))
                                                .setfetchmode( "orders ",   fetchmode.lazy)
                                                .list();
但是setfetchmode没有起作用,执行这条语句时还是加载了相应的order.
然后,我看了一下nhibernate的源码,
public   enum   fetchmode
{
default   =   0,
select   =   1,
join   =   2,
lazy   =   select,
eager   =   join
}
居然lazy   =   select,那么如果在映射中定义了lazy=false,岂不是永远都不能够lazy   loading了。
请高人指点!
发表于:2007-05-31 16:40:591楼 得分:0
lazy     =   true   好像才是缓加载吧
发表于:2007-05-31 16:48:252楼 得分:0
映射文件设置lazy=false,但是我希望在程序中使用setfetchmode语句延缓加载order
发表于:2007-06-01 09:50:333楼 得分:0
没有这样做过,我觉得还是直接设成lazy=true;吧,不然你的costumer或order数据多了之后,一个查询会执行上万条或几十万行sql。
你只要一访问orders,就算lazy=true,这个数据也要加载了。
发表于:2007-06-01 09:51:334楼 得分:0
不明白你这样做的意图是什么,不好意思
发表于:2007-06-01 09:58:385楼 得分:0
to:mingjunr   不明白你这样做的意图是什么
场景1:根据一些条件,fetch   customer列表,此时希望不加载order
场景2:点击被选中的customer,根据customerid,获取一个customer实例,同时加载它的所有order,在列表中显示。

当然,这两个场景不是特别典型,更能说明问题的是order   和   lineitem
发表于:2007-06-01 10:08:286楼 得分:0
楼主可能理解错误了,如果lazy=false,肯定不会延迟加载的
你只要设成lazy=true,肯定就能满足你的需求
场景1:不加载order,只要不访问orders属性就可以啊
场景2:加载order,只要访问orders属性就加载了
另我用activerecord,因为它也是用的nhibernate的核,应该都是一样的
发表于:2007-06-01 10:09:537楼 得分:0
那么如果在映射中定义了lazy=false,岂不是永远都不能够lazy   loading了。
我看错了,不好意思,好像确实是lazy=false了肯定不能延迟加载了
发表于:2007-06-01 10:11:178楼 得分:0
动态控制得试一下
发表于:2007-06-01 10:34:459楼 得分:0
谢谢大家的参与。
本人最不太明白的是,在nh的源码中
public   enum   fetchmode
{
default   =   0,
select   =   1,
join   =   2,
lazy   =   select,
eager   =   join
}
这就是不允许我们在自己的代码中显式地执行lazyloading,是何用意?
发表于:2007-06-01 10:42:2110楼 得分:0
我觉得在nhibernate与数据开始映射时xml文件已经不能做任何修改了,所以才会出现这个
发表于:2007-06-01 10:49:3911楼 得分:0
那到也不是,如果在映射文件中lazy= "true ",然后
ilist   customer   =   session.createcriteria(typeof(customer))
                                                .setfetchmode( "orders ",   fetchmode.eager)
                                                .list();
就会立即加载order,我已经测试过了
发表于:2007-06-01 11:01:3212楼 得分:0
只要访问orders属性就会加载吧
发表于:2007-06-01 11:07:0013楼 得分:0
楼主我是刚开始看nhibernate还不会配置不知道怎么用呢请大家给个例子看看谢谢了
zhaoxiaoming758@126.com
发表于:2007-06-01 11:09:3814楼 得分:0
直接学activerecord就行了,可以参考terrylee的博客
发表于:2007-06-01 11:15:1915楼 得分:0
to:mingjunr   只要访问orders属性就会加载吧
不是的,是只要执行,就会立即加载。即使session.close(),都可以从每个customer实例中访问它的orders。

to:zxmcl
网上很多,我觉得http://abluedog.cnblogs.com/archive/2006/04/15/375862.html还满通俗的。
如果想研究nh,建议看看孙卫琴的《精通hibernate》,虽说是java的,但是写的蛮好。
发表于:2007-06-01 11:22:0916楼 得分:0
to:mingjunr   直接学activerecord就行了,可以参考terrylee的博客
我研究nh一段时间,感觉它的功能还是很强大的,至于我提的这个问题,虽然暂时没有想到解决的办法,但是我觉得nh一定有办法解决的,最差我们可以修改它的代码呀。
至于castle   activerecord,以前没有看过,为这么一个小问题就放弃nh,改用别的技术,心有不甘呀
:)
发表于:2007-06-01 11:29:1617楼 得分:0
activerecord和nhibernate是一样的,activerecord只是简单的封装了一下nhibernate。我用activerecord是因为它不需要写hbm.xml文件了。很方便。基本上一样,你可以看一下
发表于:2007-06-01 12:09:1918楼 得分:0
ok,研究下


快速检索

最新资讯
热门点击