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).