论坛首页 入门技术论坛

[求助]Hibernate one-to-one中,lazyload失效

浏览 3062 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-01-11  
情况是这样的,Class:User对应Table:Users,Class:Property对应Table:Properties,两者是one-to-one的关系,并且cascade=all,即每个User必有一个Property,现在User和Properties各有1000条记录,调用UserDao.loadAll(),console就会出现1000条sql语句来取得对应的Property,语句如下:

Hibernate: select property0_.user_id as user1_5_0_, property0_.posts as pos
_, property0_.replies as replies5_0_, property0_.credits as credits5_0_, pr
y0_.glod as glod5_0_ from properties property0_ where property0_.user_id=?


User.hbm.xml配置如下:

<class 
    name="com.company.model.User" 
    table="users"
    lazy="true"
>

...

    <one-to-one
        name="property"
        class="com.company.model.Property"
        outer-join="auto"
        cascade="all"
        lazy="proxy"
    />

</class>


Property.hbm.xml配置如下:

<class 
    name="com.company.model.Property" 
    table="properties"
    lazy="true"
>

    <id
        name="userId"
        type="java.lang.Integer"
        column="user_id"
    >
    
        <generator class="foreign" >
        	<param name="property">user</param>
        </generator>
    </id>

...

    <one-to-one
        name="user"
        class="com.company.model.User"
        outer-join="auto"
        constrained="true"
        lazy="proxy"
    />

</class>


Hibernate版本是3,请教各位,如何配置才能让这个one-to-one成功lazy?即调用UserDao.loadAll()时不执行任何取得Property的sql?
   发表时间:2007-01-11  
参阅了一下Hibernate自己的FAQ:http://www.hibernate.org/117.html#A17
你的设置基本和例子里面的一样,不过可能是因为采用了主键关联同时又指定了cascade="all",所以使得Hibernate在没有发生读取User关联的Property对象的动作时就向数据库产生了请求……

也许在one-to-one里面指定fetch="join"可以缓解这个状况(默认的是抓取方式是select),同时在相关的Class属性里面配置batch-size也可以减少数据库的压力。

注:batch-size一般可以指定为2的倍数(如8,16,32),大小最好不要超过JDBC里面设定的batch size。
0 请登录后投票
   发表时间:2007-01-11  
Thanks,按照您的方法,的确变成1条sql了,如下

Hibernate: select this_.id as id7_1_, this_.account as account7_1_, this_.passwo
rd as password7_1_, this_.name as name7_1_, this_.gender as gender7_1_, this_.bi
rthday as birthday7_1_, this_.email as email7_1_, this_.create_time as create8_7
_1_, property2_.user_id as user1_5_0_, property2_.posts as posts5_0_, property2_
.replies as replies5_0_, property2_.credits as credits5_0_, property2_.glod as g
lod5_0_ from users this_ left outer join properties property2_ on this_.id=prope
rty2_.user_id


再请教,如果是cascade=all则必不能lazy吗?从设计上看,one-to-one基本都是cascade=all吧。。。
0 请登录后投票
论坛首页 入门技术版

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