在MySQL数据库中,休眠一对多集合的延迟加载无效



这是一个非常简单的映射。

mysql5.0

User <-一对多-> Blog

映射:

<class name="com.aaa.model.User" table="users">
    <id name="id" column="ID">
        <generator class="native"></generator>
    </id>
    <property name="username" column="USERNAME" type="string"/>
    <property name="age" column="AGE" type="int"/>
    <set name="blogs" inverse="true" fetch="join">
        <key column="userid"/>
        <one-to-many class="com.aaa.model.Blog"/>
    </set>
</class>
<class name="com.aaa.model.Blog" table="blog">
    <id name="id" column="ID">
        <generator class="native"></generator>
    </id>
    <property name="name" column="NAME" type="string" length="50"/>
    <property name="hits" column="HITS" type="integer" length="11"/>
</class>

我在<set>属性中使用"fetch=join",当我使用session.get()方法来获取User实例时,

User user = (User)session.get(User.class, new Long(1));
    for (Blog blog : user.getBlogs()) {
        System.out.println(blog.getName());
    }

输出SQL仍然是"N+1"

select
    user0_.ID as ID0_0_,
    user0_.USERNAME as USERNAME0_0_,
    user0_.AGE as AGE0_0_ 
from
    users user0_ 
where
    user0_.ID=?
select
    blogs0_.userid as userid0_1_,
    blogs0_.ID as ID1_,
    blogs0_.ID as ID1_0_,
    blogs0_.NAME as NAME1_0_,
    blogs0_.HITS as HITS1_0_ 
from
    blog blogs0_ 
where
    blogs0_.userid=?

我尝试它在hibernate 3.2和3.6,结果是一样的,这是一个bug还是什么?

我认为只有在急切获取关联时才会应用获取策略。您没有用lazy="false"标记该集合,因此该集合在第一次访问时是惰性加载的。

注意,设置lazy="false"将使Hibernate在每次加载用户时加载该用户的博客。您可能应该让该关联与lazy="true"关联,并在需要用户的博客时使用具有连接抓取功能的临时HQL查询:

select u from User u left join fetch u.blogs

最新更新