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