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
Dobry den,

Fetch mode eager mozete nastavit v hbm.xml: lazy="false", alebo priamo v HQL - v http://www.hibernate.org/hib_docs/v3/reference/en/html_single/ si dajte vyhladat 'left join fetch'.

Martin Krajci
www.systinet.com

Odpovedet emailem