Спящий режим, что является правильным способом загрузки графа объекта - PullRequest
1 голос
/ 25 августа 2011

предположим, у меня есть 3 таблицы GrandCat, Cat и Kitt. они имеют отношение один ко многим, поэтому у меня есть следующие классы. вся ассоциация ленивая загрузка.

GrandCat{
    int age;
    Set<Cat> cats;
} 

Cat{
   int age;
   Set<kitt> kitten;
   GrandCat grandCat;
}

Kit{
   String color;
   Cat cat;  
}

Я хочу построить список grandCat. условие: grandCat.age> 10 и Cat.age> 5 и имеет по крайней мере один котенок, цвет которого желтый. и когда я выполняю grandCat.getCats (), только кошки удовлетворяют условию возврата. Например, у меня есть следующие кошки. отношение как это

 grand 1(age>10)--> alex(age>5) ---> a(yellow),b,c             |
                |
                --> bob(age<5)  --->d,e(yellow)

 grand 2(age>10)  --> charlie(age<5) ---> f,g(yellow)
                   |
                   --> david(age>5)--->h
                   |
                   -->edward(age>5)-->j(yellow)
                   |
                   -->fay(age>5) --> i(yellow),k(yellow)

 other grandCats........

Я хочу, чтобы GrandCats возвращался как grand 1 и grand2 вот так

   grand1-->alex-->a
   grand2-->edward-->j
          |
          -->fay-->i,k

это миллионы внуков, кошек и котят, поэтому не нужно загружать их, а затем фильтровать.

Я знаю, что могу достичь этого, используя

select g,c,k from grandCat g inner join fetch g.cat c inner join fetch c.kitten k where g.age>10 and c.age>5 and k.color='yellow'. 

и затем зациклите возвращаемое значение, чтобы увидеть, какой кот принадлежит к какому grandCat, а котенок - к коту. но у этого есть некоторый недостаток, есть дубликаты на уровне кошки и дедушки. потому что они вернулись как

  grand1-->alex-->a
  grand2-->edward-->j
  grand2-->fay-->i        
  grand2-->fay-->k

поэтому мне нужно сравнить их и отфильтровать, когда есть много записей, это занимает время и потребляет ресурсы. у кого есть хороший способ загрузить это? я должен использовать 3 hql? сначала получите соответствие grandCat1 и grand2

select g from grandCat g inner join fetch g.cat c inner join fetch c.kitten k where g.age>10 and c.age>5 and k.color='yellow'.

затем запросите кота, используя grandcat, возвращенный из последнего запроса, а затем поместите кота в grand.setcats ()

select c from Cat c inner join fetch cat.grandCat g inner join fetch c.kitten k where g=:grandCat and c.age>5 and k.color='yellow'

затем запросить котенка и сделать то же самое?

select k from Kitt k inner join fetch k.cat c where c=:cat and k.color='yellow'

кажется утомительным.

каков наилучший способ сделать это? Между прочим, я надеюсь, что возвращенный grandCat и его 'кошка и котенок все еще имеют возможность ленивой загрузки, скажем, если у котенка есть какая-то другая ассоциация, я могу использовать их позже через ленивую загрузку.

1 Ответ

0 голосов
/ 25 августа 2011
select distinct g from GrandCat g 
inner join fetch g.cat c 
inner join fetch c.kitten k 
where g.age>10 
and c.age>5 
and k.color='yellow'

должно делать это нормально. У возвращенной бабушки в коллекции кошек будет только разыскиваемый кот, а у каждой кошки в коллекции котят будет только разыскиваемый котенок.

Имейте в виду, что, хотя Hibernate возвращает сущности, эти сущности не отражают реальность ассоциаций. Я бы относился к ним как к объектам только для чтения и не пытался каким-либо образом изменять ассоциации, потому что это может иметь катастрофические побочные эффекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...