2011-12-29 2 views
0

非常に簡単なマッピングです。はmysqlデータベースにあり、1対多コレクションの遅延ロードは無効です

データベースは多対MySQL5.0の

ユーザー< - オン>ブログ

マッピングです:

<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>プロパティに "参加=フェッチ" を使用私はそのようなUserインスタンスを取得するためにsession.get()メソッドを使用します。

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

が出力SQLは、私が休止状態3.2と3.6でそれを試して、まだ「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=? 

で、結果は同じですが、これはバグか何かでしょうか?

答えて

0

フェッチ戦略は、関連付けを熱心に取得した場合にのみ適用されると思います。あなたはlazy="false"でセットに印をつけていないので、セットは最初にアクセスされたときにレイジーロードされます。

lazy="false"を設定すると、ユーザーがロードされるたびにHibernateがユーザーのブログを読み込むようになります。あなたはおそらくlazy="true"との関連をみましょう、そしてあなたは彼のブログを持つユーザーが必要なときに取り出し参加してアドホックHQLクエリを使用する必要があります:私は "を追加したとき

select u from User u left join fetch u.blogs 
+0

感謝の男は、あなたが言ったことは、非常に右でありますlazy = fasle "と" batch-size = 2 "に変更した場合、または" lazy = fasle "と" fetch = join "の両方が必要になる場合があります。 "lazy = false"と "fetch = subselect" まだ動作していません(N + 1タイプを使用)。 – gamein

+0

Err、はい。結合が必要な場合は、結合を使用します。それがそれのためのものです。 –

関連する問題