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