2013-04-25 2 views
0

Я использую Hibernate 3,6
Пользователь класс объект
Контакта является класс сущности
Пользователя имеет набор < Контакта >
Отношение однонаправленное и отображаются в один-к -многие.
Я пробовал следующие ленивые комбинации загрузки и извлечения. Вот список моего понимания и фактические результаты
отложенной загрузки и Fetch стратегия

с session.get (User.class, < некоторые идентификатор пользователя >) или Session.load (User.class, < некоторые USERID >)

lazy  fetch  result 

* true  join  ignores lazy loading 
*      1 select for retrieving the User and his contacts with a left outer join 
*   select  1 select for a User record 
*      1 select for all contacts of the user 
*   subselect 1 select for a User record 
*      1 select for all contacts of the user 
* false  join  1 select for retrieving the User and his contacts with a left outer join 
*   select  1 select for a User record 
*      1 select for all contacts of the user 
*   subselect 1 select for a User record 
*      1 select for all contacts of the user 

с session.createQuery (от пользователя)

lazy  fetch   result 

* true  join   1 select for all User records 
*       1 select for each User record to retrieve their contacts 
*       respect lazy loading 
*       probable n + 1 
*   select   1 select for all User records 
*       1 select for each User record to retrieve their contacts 
*       probable n + 1 
*   subselect  1 select for all User records 
*       1 sub-select to retrieve all contact records in one go 
* false join   1 select for all User records 
*       1 select for each User record to retrieve their contacts 
*       probable n + 1  
*   select   1 select for all User records 
*       1 select for each User record to retrieve their contacts 
*       probable n + 1 
*   subselect  1 select for all User records 
*       1 sub-select to retrieve all contact records in one go 

Вот несколько вопросов, которые у меня есть:

  1. Правильно ли я понимаю?
  2. С session.get(), когда lazy = true, fetch = subselect, почему Hibernate не выполняет подзапрос? Наверное, это потому, что это абсолютно необходимо. Я прав ?
  3. С session.get(), когда lazy = false, fetch = subselect, почему Hibernate не выполняет подзапрос? Он должен выполнить один здесь, но это не так. Интересно, почему ?
  4. С session.createQuery() когда lazy = true, fetch = join, почему Hibernate ленивая загрузка? Раньше этого не делалось с session.get()
  5. С session.createQuery(), когда lazy = false, fetch = join, почему Hibernate не использует соединение?

Заранее спасибо

+0

Эй, ребята! Мне нужно несколько быстрых указателей на этом посту. Надеюсь получить отклик. Благодарю. – Xan

ответ

0

Ok людей, после того, как много копать это то, что я могу сделать вывод. Просто хотел поделиться своими трофеями со всеми вами. Если кто-то чувствует, что они могут добавить к этому больше, вам будет очень приятно. Позвольте мне начать с образца набора данных.

 
The user table 
-------------------------------------------------- 
USER_ID  USERNAME 
-------------------------------------------------- 
1   User One 
2   User Two 
3   User Three 

The contact table 
------------------------------------------------------------------------------------------------------------------- 
CONTACTID TITLE FIRSTNAME LASTNAME  CITY  COUNTRY    EMAIL      USER_ID 
------------------------------------------------------------------------------------------------------------------- 
1   Mr.  Clark  Kent  New York  United States  [email protected]  1 
2   Mr.  Hank  Ketcham  Manhattan  United States  [email protected] 2 
3   Mr.  Tony  Stark  Malibu   United States  [email protected]   2 
4   Mr.  Bruce  Wayne  Gotham   United States  [email protected]   2 

Q2. С session.get(), когда lazy = true, fetch = subselect, почему Hibernate не выполняет подзапрос? Наверное, это потому, что это абсолютно необходимо. Я прав ?

A2. Да, здесь нет необходимости в подзапросе. Вот то, что подзапрос может выглядеть

 
SELECT 
    u.USER_ID AS USER1_1_, 
    u.USERNAME AS USERNAME1_, 
    c.USER_ID AS USER15_1_1_, 
    c.CONTACTID AS CONTACTID1_, 
    c.CONTACTID AS CONTACTID0_0_, 
    c.TITLE AS TITLE0_0_, 
    c.FIRSTNAME AS FIRSTNAME0_0_, 
    c.LASTNAME AS LASTNAME0_0_, 
    c.CITY AS CITY0_0_, 
    c.COUNTRY AS COUNTRY0_0_, 
    c.EMAIL AS EMAIL0_0_, 
    FROM 
     user u,contact c 
    WHERE 
     u.USER_ID = 2 
    AND 
     c.USER_ID IN  
     ( 
      SELECT USER_ID FROM user WHERE USER_ID = u.USER_ID 
     ) 

Я не вижу никакой пользы от выполнения подвыбора здесь над текущей стратегией просто выполняю отдельные выбрать для контактных записей. Infact, подзапрос может быть ненужным утечкой производительности.

Q3. С session.get(), когда lazy = false, fetch = subselect, почему Hibernate не выполняет подзапрос? Он должен выполнить один здесь, но это не так. Интересно, почему ?

A3. ОК.Опять же здесь является то, что к югу от выбора может выглядеть следующим образом (в точности похож на тот, выше какой-либо другой идентификатор)

 
SELECT 
    u.USER_ID AS USER1_1_, 
    u.USERNAME AS USERNAME1_, 
    c.USER_ID AS USER15_1_1_, 
    c.CONTACTID AS CONTACTID1_, 
    c.CONTACTID AS CONTACTID0_0_, 
    c.TITLE AS TITLE0_0_, 
    c.FIRSTNAME AS FIRSTNAME0_0_, 
    c.LASTNAME AS LASTNAME0_0_, 
    c.CITY AS CITY0_0_, 
    c.COUNTRY AS COUNTRY0_0_, 
    c.EMAIL AS EMAIL0_0_, 
    FROM 
     user u,contact c 
    WHERE 
     u.USER_ID = 3 
    AND 
     c.USER_ID IN  
     ( 
      SELECT USER_ID FROM user WHERE USER_ID = u.USER_ID 
     ) 

Как вы можете видеть, что это не даст никаких записей, так как USER_ID = 3 не имеет каких-либо контактных записей , Это поражает всю цель выполнения session.get() для записи пользователя, в которой get() возвращает null, несмотря на то, что в таблице есть действительная запись пользователя. Таким образом, единственный выбор для записи контактов - единственный выход.

Q4. С session.createQuery(), когда lazy = true, fetch = join, почему Hibernate ленивая загрузка? Раньше этого не делалось с session.get()

Q5. С session.createQuery(), когда lazy = false, fetch = join, почему Hibernate не использует соединение?

Ans. В моем нынешнем понимании говорится, что это может быть просто потому, что Hibernate не хочет заканчивать запуск соединения, которое выбирает огромный набор данных (содержащий все пользовательские записи и их контактные записи) и загружает огромную коллекцию в память.

Смежные вопросы