A neresi tenhle problem tovarni metody?
Misto toho aby jste zavolal new Okres(), addOkresToKra(okes), tak proste
zavolate kraj.createNewOkres().
A tovarni metoda samozrejme s AOP pocita.
Ja to takhle resim (ani mne to nenapadlo resi jinak) a nemam problem.
Lukas "benzin" Benda ([EMAIL PROTECTED]; http://benzin.bloguje.cz)
Java a Delphi programator
PHP a JavaScript skrypter
Tvurce databazovych aplikaci
A "cestinarsky" ignorant
Benda Lukas wrote:
Vysvetleni je strasne jednoduche. Pokud maji byt objekty nacitany
pomoci lazy, musi mit odkaz na otevreny session. To znamena, ze po
celou dobu zivota rodicovskeho objektu, musi byt session otevrena, co
kdyby se nejaky lazy parametr mel zrovna nacist.
To je znacne nehospodarne ne? Takze spring automaticky po ukonceni
behu vlakna session uzavre. No ale pak zjevne nemuze fungovat lazy.
Jak z toho?
Prvni moznost je session zachytit a neumoznit jeji uvoneni. To
znamena ze nechate vlakno ktere vlastni session zit. Brzi se ale
dostanete do problemu.
Takze druha moznost je vyuzit vlastni metodiku lazy nacitani. Logicky
by se do kazde metody ktera vrati line nacitane objekty dalo pridat
nacteni z nejakeho dao readeru, jenze pak je tu potrebne odchytit
ukladani objektu rodicovskeho, aby se i lazy drzene objekty ukladali
taky. Ale v male aplikaci je to suverejne nejlepsi reseni. V podstate
se tak oprostite i od hibernate, vyhnete se spouste problemu a celou
ORM si udelate sam na miru. Cas ktery spotrebujete na vytvareni
takovehoto ORM modelu, je pri malych aplikacich (s malym mnozstvim
tabulek) vyrazne nizsi nez kolik poterbujete na zkroceni hibernate.
No ale ve vetsim projektu, se hibernate uz vyplati. Takze pak se
logicky nabizi moznost AOP. Spring ma specialni AOP object pro
komunikaci s hibernate. V definici pak vubec lazy nepouzivate a
nacitani nechavate na springu, ktery vse zaridi pres AOP:
<bean id="jHasEvidHibernateInterceptor"
class="org.springframework.orm.hibernate3.HibernateInterceptor">
<property name="sessionFactory">
<ref bean="jHasEvidSessionFactory"/>
</property>
</bean>
<bean id="krajTarget" class="cz.apnetis.jhasevid.db.KrajClass">
<property name="association"><ref bean="association"/></property>
</bean>
<bean id="kraj"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target"><ref bean="krajTarget"/></property>
<property name="proxyInterfaces">
<value>cz.apnetis.jhasevid.db.KrajInterface</value>
</property>
<property name="interceptorNames">
<list>
<value>jHasEvidHibernateInterceptor</value>
</list>
</property>
</bean>
Kde association je jakykoli parametr ktery ma byt jednoduse predan.
Pokud se nepletu, tak toto reseni moc nepomuze.
Problem je, ze Spring AOP neumi obalovat instance objektu, ktere
vytvarite pomoci new Constructor(), coz Hibernate dela.
Smysl to ma pouzit jedine, pokud tim obalite DAO tridu, jejiz instanci
ziskate od Spring ApplicationContextu a dale jak uz jsem psal v
predchozim mailu k tomuto tematu.
Jinak s tim ukladanim objektu nactenych "lazy" v jine session muzou
byt docela problemy, protoze je mate ve dvou ruznych session, tak jsou
oddelene i JDBC transakce pod tim, takze je nutne volat vice commitu
apod.