Diky za Vase nazory a zkusenosti. Byl to celkem plodny thread.

Vyresil jsem nakonec celkem elegantne pomoci AOP a _jedne_ session faktory 
takto:

1) Mam AOP interceptor, ktery se aplikuje na gettery vsech peristetnich objektu:

<bind pointcut="execution(* $instanceof{blabla.persist.po.PO}->get*())">
    <interceptor class="blabla.web.common.aop.LazyLoaderInterceptor"/>
</bind>

2) Interceptor zjistuje, zda je prislusny getter volan z transakcniho kontextu. 
Pokud ano, tak proste vrati vysledek volani getteru (je k dispozici otevrena 
session, takze netreba nic explicitne dotahovat). Pokud jsem mimo transakcni 
kontext (nekde ve view) a getter vratil proxy ci proxy kolekci, zavolam metodu, 
ktera sama bezi v transakcnim kontextu, cimz vyuziju stavajici session factory 
navazanou na JTA. Metoda vypada zhruba takto:

  /**
   * [EMAIL PROTECTED]
   */
  public void initializeDetachedProxy( PO owner, Object proxy )
  {
    Persister persister = getPersister();
    Session session = persister.getSession();
    session.lock( owner, LockMode.NONE );
    session.setReadOnly( owner, true );

    // initializes the proxy / proxied collection
    Hibernate.initialize( proxy );

    session.clear();  // should not be neccessary, but one never knows...
  }

3) Necham JTA flushnout prazdnou session a s inicializovanym proxy objektem 
normalne pracuji ve view.

Je jasny, ze reseni tohoto typu, stejne tak jako ruznych variaci 
open-session-in-view, neni dobre prilis zneuzivat na dotahovani vetsiho 
mnozstvi dat, ale to se da velmi snadno uhlidat sbiranim a kontrolou statistik 
poctu volani initializeDetachedProxy pro jednotliva URL (ci spise 
request.getServletPath()).

Honza

-----Původní zpráva-----
Od: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] za uživatele Lukas Benda
Odesláno: Tuesday, June 12, 2007 17:03
Komu: Java
Předmět: Re: Hibernate aneb jak se (ne)vyhnout DTO


Jenze ono stejne nakonec zjistite, ze ty kolekce jsou na pytel. Stejne ty data 
budete chtit tahat v ruznem poradi, nebo je nejak filtrovat a to se s 
kolekcema
tak jak tak neda.

Dalsi moznost je udalt si vrstvu, ktera bude nektere objekty ziskane z 
databaze
proxovat a na dotazy o kolekcich si pak sama otevre session a data si nacte. 
Nekdy se tomu rika Wrapper. OOP je spokojeno, protoze veskera data nese 
skutecne jeden objekt, i kdyz wrapper a Vy si usetrite spousty vrasek. Navic 
tak ziskante novou funkcnost, ktera Vam umozni pruzne reagovat na stav 
aplikace
a do kolekci poustet jenom to co je potreba a v takovem poradi v jakem je 
potreba.

Btw. a nebo se to da resit pomoci AOP. Coz uz se nekde vys v diskusi 
rozebiralo
a je to funkcni (ja to pouzivam v jedene aplikaci).

Lukas "benzin" Benda

Dne úterý 12 červen 2007 11:51 Jiri Mares napsal(a):
> Ahoj,
>
> jo jo uz jsem to take slysel, ale to se i zase nelibi z pohledu OOP, 
> nejaka IDcka, ktera jsou stejne jenom pro DB ....
>
> Ale je to jiste reseni, ovsem z meho pohledu podobne definovani vsech 
> vazeb jako lazy, a nepouzivajici join ...
>
> Jirka
>
> > a co použít Hibernate bez vazeb? Tj. nemít vazby mezi objekty formou 
> > reference na objekt, ale jako číslo? Tím se zbavíte těchto problémů 
> > a při tom si zjednodušíte práci, protože nemusíte dělat mapování. Na 
> > iBatisu mi vadilo to, že jsem musel mnoho věcí vytvářet ručně (v 
> > porovnání s Hibernate).

Odpovedet emailem