Pokud je todle cele mapovani a vy pouzivate HQL dotaz "from Record", pak mi neni vubec jasne z jakych duvodu hibernate
vraci proxy objekty???
Nemate nahodou u tagu hibernate-mapping attribut default-lazy="true"?
Pro Goo GGooo: Todle _neni_ cele mapovani, protoze prave chybi hibernate-mapping tag, kde se da nastavit fura
_dulezitych_veci!!
Goo GGooo wrote:
On 1/11/06, Martin Krajci <[EMAIL PROTECTED]> wrote:
Goo GGooo wrote:
resim tady problem s hibernate 3.0. Mam class Record a jeji dva
potomky MessageRecord a Exception Record. Mapovani je zhruba takhle:
<class name="Record">
<id name="id"><generator class="native" /></id>
<property name="message" />
</class>
<joined-subclass extends="Record" name="MessageRecord">
<key column="id" />
<property name="title" />
</joined-subclass>
<joined-subclass extends="Record" name="ExceptionRecord">
<key column="id" />
<property name="severity" />
</joined-subclass>
Pro Jiriho Marese: tohle _je_ cele mapovani. Jen jsem vykuchal nektere
jednoduche <property> ktere na vysledek nemaji vliv.
Vypis tohoto cyklu:
1: class pokus.Record$$EnhancerByCGLIB$$f50d8bc6: Tohle je nejaka
normalni zprava...
2: class pokus.Record$$EnhancerByCGLIB$$f50d8bc6: Tohle je vyjimecna zprava
Jelikoz oba vracene objekty jsou
pokus.Record$$EnhancerByCGLIB$$f50d8bc6 tak na ne nefunguje
"instanceof" a ja nevim ktery je ktery.
Kdyz do query dam "from MessageRecord" tak mi to poctive vrati objekty
pokus.MessageRecord$$enhancer...$$ a "instanceof" funguje, jenze ja
bych chtel vybrat vsechny objekty.
[...]
Problem je asi v tomto: Hibernate vytvoril proxy na Record a preto
nebudete moct pouzit typecast a instanceof operator bude vraciat false,
pretoze sa jedna o proxy na objekt a nie samotny objekt. Hibernate mohol
vytvorit proxy s viacerych dovodou. Jeden z nich moze byt ze Record je
ako lazy="true", alebo dalsi moze byt ze fetch mode nieje eager. Takze
ma napadaju 2 moznosti:
1) pouzit
.setFetchMode(..., FetchMode.EAGER)
Jestli to dobre chapu, tak setFetchMode() muzu pouzit jen pro
Criteria-queries, ne pro HQL. Existuje nejaky ekvivalent v HQL? Navic
pro Criteria to ani nastavovat nemusim, protoze to mi vraci objekty
bez proxy:
Iterator i = session.createCriteria(Record.class).list().iterator();
// funguje bez proxy
Iterator i = session.createQuery("from Record").iterate(); //
nefunguje, objekty s proxy
2) record este raz s DB vytiahnit ked iterujete
session.load(record.getId())
To mi nefunguje. Prvni parametr load() musi byt class, jenze ja z
recordu nepoznam jestli je to MessageRecord nebo ExceptionRecord
instance, takze nevim jak load() zavolat.
Gooo
--
Jiří Mareš (mailto:[EMAIL PROTECTED])
ČSAD SVT Praha, s.r.o. (http://www.svt.cz)
Czech Republic