AppEngine JDO i głębokość rekursywnego ładowania list
Ostatnio odkryłem bardzo przydatne ustawienie dla PersistentManager’a. Miałem klasę A, jednym z pól klasy A była lista obiektów typu B. Obiekt B również posiadał pole będące listą obiektów typu C.
Tworzyły one pewną całość, listy były niewielkie, maksymalnie kilka elementów, więc chciałem je załadować kompletnie ładując obiekt typu A. Pierwszym krokiem było zdefiniowanie obiektu A:
@PersistenceCapable(identityType = IdentityType.APPLICATION) public class A { @Persistent(defaultFetchGroup = "true") private List<B> bs = new ArrayList<B>(); }
potem B:
@PersistenceCapable(identityType = IdentityType.APPLICATION) public class B { @Persistent(defaultFetchGroup = "true") private List<C> cs = new ArrayList<C>(); }
i w końcu C, było jakąś dowolna klasą.
Niestety, ładując obiekt A jedynie lista obiektów B – bs – była ładowana automatycznie, pole cs klasy B miało wartość null, pomimo, że ładując sam obiekt B lista była ładowana kompletnie.
Problem rozwiązało ustawienie MaxFetchDepth w polu FetchPlan klasy PersistentMabager’a:
protected PersistenceManager pm() { PersistenceManager persistenceManager = pmFactory.pm(); persistenceManager.getFetchPlan().setMaxFetchDepth(3); return persistenceManager; }
Znalazłem również atrybut adnotacji:
@Persistent(defaultFetchGroup = "true", recursionDepth = 3)
ale on, nie wiedzieć czemu nie rozwiązał problemu, jak mówi dokumentacja recursionDepth działa tylko w przypadku używania FetchGroup – ale jeszcze nie rozgryzłem jak to zgrać w działające rozwiązanie.










Zostaw odpowiedź!
Musisz się zalogować aby móc komentować.