Ahoj,
tohle vlakno mne pripomelo jiste potize s hibernate, na ktere jsem kdysi narazil. Na schematicke dedicne hiearchii, co pochazela z nize uvedeneho mapovani neslo pouzit operator instanceof.
Proxy implementovala vsechny 3 interfacy najednou, coz jsem tedy necekal .
Za behu proto slo rozlisit zda se jedna o IntefaceA nebo o InterfaceB pouze pres hodnotu sloupce CATEGORY.

<hibernate-mapping>
<class abstract='true' name='AbstrObj'
  table=...
 proxy='InterfaceAbstrObj'>
...
   <discriminator column="CATEGORY" .../>

   ...
   <subclass  discriminator-value="1" ...
       name='A'
       proxy='IntefaceA'>
...
   </subclass>


   <subclass discriminator-value="2" ...
   name='B'
    proxy='IntefaceB'
 ...
   </subclass>

</class>
</hibernate-mapping>

Pavel Skop

----- Original Message ----- From: "Kamil Podlesak" <[email protected]>
To: "Java" <[email protected]>
Sent: Thursday, March 11, 2010 1:57 PM
Subject: Re: hibernate a instanceOf


Pozor na pořadí:
A instanceof B  <==>  B.class.isAssignableFrom(A.getClass())

ALE

Podíval jsem se na to pořádně a musím si posypat popel na hlavu:
problém je někde úplně jinde a isInstance by dokonce bylo správně.
Problém je ve skutečnosti v tom, že Hibernate vytvoří proxy pro
Customer, i když objekt je ve skutečnosti potomek.

Je to specifický problém Hibernate a řešením je deproxyfikace pomocí
(HibernateProxy)o).getHibernateLazyInitializer().getImplementation(),
případně vypnutí proxy pomocí @Proxy(lazy=false)  (tady je ale otázka
zda to je použitelné...). Více podrobností (a odkazy na další varianty
řešení) na:

http://blog.smart-java.nl/blog/index.php/2010/03/08/hibernate-lazy-loading-and-inheritance/

Kamil Podlešák

PS: Asi si budu muset stáhnout aktuální zdrojáky a podívat se, jakým
způsobem sleduje změny bez proxy, to mě docela zajímá.

2010/3/11 Ivan Polak <[email protected]>:
podla rady som uvedeny riadok :

returnValue = Class.forName(className).isInstance(o);

zmenil na:

returnValue = o.getClass().isAssignableFrom(Class.forName(className));

ako som uviedol className je premenna typu String s hodnotou
"com.project.Shipper"
a Objekt o je cez Hibernate vytiahnuty objekt z DB, zobraznene vo
watch okne: Customer_$$_javassist_145 (...).


dakujem

Ivan

2010/3/11 Kamil Podlesak <[email protected]>:
Pokud si dobře pamatuji, tak tímto způsobem i sleduje, zda a kdy (a
jak) se změnily hodnoty, aby je pak uložil.

Každopádně, ještě bych dodal: původní tazatel udělal chybu v tom, že
za dynamickou obdobu operátoru instanceof považoval Class.isInstance,
což je špatně (správně je Class.isAssignableFrom).

Kamil Podlešák

2010/3/11 Roman Pichlík <[email protected]>:
Ne často, vždy :-)
Je to základní princip fungování Hibernate.

to bych nerekl, ze vzdycky vraci proxy. IMHO pouze pokud je to potreba
napr. lazy loading.

--
S pozdravem Roman "Dagi" Pichlik

/* http://www.sweb.cz/pichlik/ Blog pro kodery */






--------------------------------------------------------------------------------



Pŕîchozî zpráva neobsahuje viry.
Zkontrolováno AVG - www.avg.cz
Verze: 9.0.733 / Virová báze: 271.1.1/2743 - Datum vydánî: 03/13/10 08:33:00

Odpovedet emailem