в базе данных mysql недопустимая отложенная загрузка из коллекции в спящий режим - PullRequest
0 голосов
/ 29 декабря 2011

Это очень простое сопоставление.

База данных mysql5.0

Пользователь <-one to many-> Блог

Отображения:

<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>

Я использую "fetch = join" в свойстве <set>, когда я использую метод 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, результат такой же, это ошибка или что-то в этом роде *

1 Ответ

0 голосов
/ 29 декабря 2011

Я думаю, что стратегия извлечения будет применяться только в том случае, если связь извлечена с нетерпением.Вы не пометили набор с lazy="false", поэтому набор загружается лениво при первом обращении к нему.

Обратите внимание, что настройка lazy="false" заставит Hibernate загружать блоги пользователя каждый раз, когда пользователь загружается.Возможно, вам следует разрешить ассоциацию с lazy="true" и использовать специальный HQL-запрос с извлечением соединений, когда вам нужен пользователь с его блогами:

select u from User u left join fetch u.blogs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...