JPA Wyłączenie przy fetch LAZY I EAGER jednocześnie

0

Witam

Używam JPA + Hibernate z REST service na libach jersey.

Chciałbym wyłączyć i ile to możliwe featching LAZY I EAGER.

Dlczego ?

Dlatego ,że jak powiedzmy mam relacje typu parent-childer (czyile one-to-many) to chciałbym dane pobierać na dwa przypadki:

  1. Chcę pobrać wszystkie parenty ale bez kolekcji childer
  2. Chcę pobrać wszystkie parenty wraz z kolekcjią childer

Webserice produkuje xml.

Pierwszy przypadek mogę rozwiązać za pomocą adnotacji @XmlTransient i jest ok,
ale wtedy drugi przypadek nie zadziała bo webservice nie zwróci mi chieldrenów.
Jak dam LAZY w @OneToMany to przy zwracaniu rekordów przez webservice bez @XmlTransient on wywoła getChildrens i wtedy wywoła się zapytanie
,którego nie chce dla 1 przypadku.

Najlepiej było by sparametryzować adnotacje @XmlTransient ,ale nie ma takiej opcji ("albo wóż albo przewóż").

Albo wyłączyć LAZY I EAGER (o ile się da) i pobiereać zawsze to czego się potrzebuje za pomocą criteriaapi czy fetchjoin.
I właśnie wyłączenie LAZY I EAGER byłoby to co by mnie zadowoliło ,ale jak to zrobić, albo jak sparametryzować @XmlTransient

3

O jejku jejku nie wypróżniaj się modelem bazy danych na front zrób DTO/Projekcje

0
Szczery napisał(a):

O jejku jejku nie wypróżniaj się modelem bazy danych na front zrób DTO/Projekcje

nie mam zamiaru, właśnie chodzi o to by hibernate nie zaciągał zbędnych danych ,których w danym momencie nie potrzebuje
a mapowanie danych z zapytania na objekty to chyba nie tędy droga, bo jak bym chciał to osiągnąć to użyłbym sterownika JDBC i ResultSet i ręcznie przypisywał wyniki do objektów

0

?

0

A jakbyś wyłączył lazy w trybie runtime poprzez
childer = new HashSet()
?

EDIT:
A jeśli chodzi o Jaxb, to możesz użyć adaptera:

  @XmlJavaTypeAdapter(Adap.class)
  public List<Page> pages = new ArrayList<Page>();

  public static class Adap extends XmlAdapter<Page[], List<Page>>
  {
    private boolean dontFetch = false; 

    @Override
    public Page[] marshal(List<Page> arg0) throws Exception {
      if (dontFetch)
        return new Page[0];
      else
        return arg0.toArray(new Page[0]);
    }

    @Override
    public List<Page> unmarshal(Page[] arg0) throws Exception {
      throw new NotYetImplementedException();
    }
    
  }
0
jarekczek napisał(a):

A jakbyś wyłączył lazy w trybie runtime poprzez
childer = new HashSet()
?

EDIT:
A jeśli chodzi o Jaxb, to możesz użyć adaptera:

  @XmlJavaTypeAdapter(Adap.class)
  public List<Page> pages = new ArrayList<Page>();

  public static class Adap extends XmlAdapter<Page[], List<Page>>
  {
    private boolean dontFetch = false; 

    @Override
    public Page[] marshal(List<Page> arg0) throws Exception {
      if (dontFetch)
        return new Page[0];
      else
        return arg0.toArray(new Page[0]);
    }

    @Override
    public List<Page> unmarshal(Page[] arg0) throws Exception {
      throw new NotYetImplementedException();
    }
    
  }

ok a w jaki sposób mogę wysyłać parametr do tego adaptera kiedy pobieram dane z webservice przez GET ?

0

Widzę, że tak trochę niestarannie piszesz, więc daj sobie z tym spokój. To by strasznie zagmatwało projekt, a przecież możesz to zrobić w prosty sposób, jak radzą inni.

1 użytkowników online, w tym zalogowanych: 0, gości: 1