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