Zdravim,
v nize uvedem mailu pises, ze umis zkonfigurovat Hibernate, aby
vytvarel objekty nacitane z databaze pomoci tovarnich metod (jinak je
nemuzes mit obalene aspekty).
Tak jsem si rikal, ze to vyzkousim, ale nenasel jsem zpusob jak to
Hibernatu v mapovani vysvetlitl. Vsude se jen pise, ze ma POJO musi mit
bezparametricky konstruktor, aby slo pouzit volani
Constructor.newInstance(). Podle mne to ani mozne, protoze Hibernate
dela proxy tridy, ktere musi od mapovane tridy dedit, a pokud mam na
tride jen tovarni metodu a vsechny konstruktory private, tak dedit nelze.
Muzes prosim poslat priklad, kde to mas tak jak pises nize pouzite.
Diky,
Lukas
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.