Goo GGooo wrote:

Ahoj vsichni,

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>

Mam ulozeno par objektu, ktere budto muzu vybrat podle ID, to funguje,
nebo pres HQL a tam je kamen urazu. Kdyz je HQL query proste "from
Record" tak mi to sice vrati vsechny objekty, ale nedokazu zjistit
jestli se jedna o MessageRecord nebo ExceptionRecord:

       Iterator i = session.createQuery("from Record").iterate();
       while (i.hasNext()) {
           Record r = (Record) i.next();
           System.out.print(r.getId() + ": " + r.getClass() + ": "+
r.getMessage());   // *1

           if (r instanceof MessageRecord)
               System.out.print(" - MessageRecord: " +
((MessageRecord)r).getTitle());

           if (r instanceof ExceptionRecord)
               System.out.print(" - ExceptionRecord: " +
((ExceptionRecord)r).getSeverity());

           System.out.println();
       }

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.

Ma nekdo tip jak na to?

Diky!

Gooo
Dobry den,

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)

alebo,

2) record este raz s DB vytiahnit ked iterujete

session.load(record.getId())


Martin Krajci
www.systinet.com




Odpovedet emailem