论坛首页 入门技术论坛

one-to-many多层次时lazy不起作用

浏览 5213 次
该帖已经被评为新手帖
作者 正文
   发表时间:2006-10-15  
有对象A,B,C
A对象中有多个B,B对象中有多个C

A中B,B中C都设定lazy="true"

经过sql输出跟踪
取出A的时候,如果不调用A.getBSet(),那么lazy起作用,
但如果调用了A.getBSet(),那么不但所有属于A的B取出来了,而再深一层的C也被取出来了,就是说这个时候B到C的lazy="true"失效了,但程序本身只需要对每个A取出B就行了的,而不是整个关系树都抓出来

有人知道这是什么原因么?或者如何解决?
这样性能损耗太大了,大了一个数量级。

映射文件大概是这个样子:
<class name="A" table="A">
 <id name="id" type="int">
            <column name="id" sql-type="int" not-null="true"/>
            <generator class="native"/>
        </id>
 <set name="BSet" cascade="all" inverse="true">
            <key column="A_id"/>
            <one-to-many class="B"/>
        </set>
</class>
<class name="B" table="B">
 <id name="id" type="int">
            <column name="id" sql-type="int" not-null="true"/>
            <generator class="native"/>
        </id>
 <set name="CSet" cascade="all" lazy="true" inverse="true">
            <key column="B_id"/>
            <one-to-many class="C"/>
        </set>
</class>
<class name="C" table="C">
 <id name="id" type="int">
            <column name="id" sql-type="int" lazy="true" not-null="true"/>
            <generator class="native"/>
        </id>
</class>
   发表时间:2006-10-23  
你这是单向的一对多的关系

看你的映射文件

不知道关系怎么维护的

0 请登录后投票
   发表时间:2006-10-25  
是的,因为你A.getBSET()的时候,已经初始化了所有的动态代理类b的对象,这个代理类b对象有个属性是所有的c的集合,当然也全部查出来了
0 请登录后投票
   发表时间:2006-10-27  
这种问题应该可以通过调整集合属性的抓取策略来解决
0 请登录后投票
   发表时间:2006-10-27  
这个问题应该有一个好的方式解决,
我只能说数据库方面设计应该可以改善.
0 请登录后投票
   发表时间:2006-10-27  
实在不行的话,或者可以设置lazy="extra"试试看……
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics