2011-03-25 8 views
9

Mam takie samo pytanie, jak ktoś opublikowany w Społeczności Hibernacji: FetchProfiles.Jak uzyskać Hibernate FetchProfile, aby załadować głębokie obiekty podrzędne w hierarchii?

Ze względu na wydajność mam relacje w modelu danych w następujący sposób:

...C -[FetchType.LAZY]-> D -> [FetchType.LAZY] -> E 

Korzystanie FetchProfile mogę niecierpliwością obciążenia D z C, ale nie mogę dowiedzieć się, jak ochoczo załadować E. wiem Mogę z powodzeniem używać nazwy NamedQuery za pomocą wewnętrznych sprzężeń, ale to naprawdę mnie niepokoi, że nie mogę się dowiedzieć, jak to zrobić za pomocą FetchProfile. Przykładem próby FetchProfile (cokolwiek innego ginie w mrokach czasu):

@FetchProfile(name = "cwithDAndE", fetchOverrides = { 
     @FetchProfile.FetchOverride(entity = C.class, association = "dByCId", mode = FetchMode.JOIN), 
     @FetchProfile.FetchOverride(entity = D.class, association = "eByDId", mode = FetchMode.JOIN) 
}) 

ja umożliwić FetchProfile na sesję iz powodzeniem używać session.get bez błędów i C i D zaludnionych - E wciąż leniwy i nieopłacony. W desperacji pamiętam próbowanie notacji kropek dla skojarzenia od C w dół. Mogę tylko znaleźć przykłady, które mają głębię jeden.

Jest to luka typu OCD w mojej wiedzy, która wymaga wypełnienia!

Z góry dziękuję za pomoc.

+0

Czy możesz przesłać adnotacje z zajęć C, D i E? (oprócz FetchTypes) –

Odpowiedz

3

Masz obiekt zawierający obiekt B, zawierający obiekt C obj. Domyślnie są one

...A -[FetchType.LAZY]-> B -> [FetchType.LAZY] -> C 

Klasa: Klasa

@FetchProfiles({ 
    @FetchProfile(fetchOverrides = { @FetchOverride(association = "b", entity = A.class, mode = FetchMode.JOIN) }, name = "a-with-b") 
    }) 
@Entity 
@Table(name="EDITOR_IDENTITIES") 
public class A { 
    private B b;  
    //... 
} 

B:

@FetchProfiles({ 
    @FetchProfile(fetchOverrides = { @FetchOverride(association = "c", entity = B.class, mode = FetchMode.JOIN) }, name = "b-with-c") 
    }) 
@Entity 
@Table(name="EDITOR_IDENTITIES") 
public class B { 
    private C c;  
    //... 
} 

Adao klasa:

@Repository(value="aDaoImpl") 
@Transactional 
public class ADaoImpl { 

    @Override 
    public A loadByPrimaryKey(long id) 
    { 
     Session session = sessionFactory.getCurrentSession(); 
     session.enableFetchProfile("a-with-b"); 
     session.enableFetchProfile("b-with-c"); 
     Criteria criteria = session.createCriteria(A.class); 
     criteria.add(Restrictions.eq("id", id)); 
     A a = (A) criteria.uniqueResult(); 
     if(identity != null) 
      return identity; 
     else 
      return null; 
    } 
} 

otrzymasz A wypełnione B wypełnione C. Jest to bardzo podstawowe rozwiązanie, możesz zbudować metodę Dao pobierającą listę profilu pobierania jako argument.

Powiązane problemy