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.






Odpovedet emailem