Re: hibernate a instanceOf

2010-03-12 Tema obsahu Kamil Podlesak
To už jsme vyřešili, myslel jsem si že Hibernate používá přetížené
settery pro sledování změn - což není pravda, s něčím jsem si to
spletl...
Nicméně je potřeba počítat s tím že při práci s Hibernate se proxy
může objevit a že tato proxy může být odvozena od deklarovaného
předka, i když uvnitř je potomek.

Kamil Podlešák


2010/3/11 Roman Zakutny roman.zaku...@gmail.com:
 Predstavte si entitu A, ktora ma v sebe referenciu na entitu B s anotaciou
 @OneToOne(fetch=LAZY).
 Ked nacitate objekt A pomocou Hibernate, za normalnych okolnosti nebude
 proxiovany. Proxy reprezentuju len vnutorne referencie na objekty, ktore su
 natahovane lazy - v nasom pripade B. @OneToOne a @ManyToOne proxiuje Entity
 objekt, @ManyToMany a @OneToMany proxiuje Collection. Ten zapuzdrujuci
 objekt A by bol proxy, keby sme priamym pristupom na jeho getter chceli
 nacitat lazy data. To vsak nie je bezne: nenacitavame predsa meno osoby lazy
 modom...
 Cele to smeruje k tomu, ze kludne mozete pristupit na lazy referenciu B
 reprezentovanu proxy objektom a na nej dokonca na jej ID, ktore bude
 inicializovane. To je vdaka tomu, ze ID je dostupne v ramci tabulky, ktoru
 tym zapuzdrujucim objektom A mapujete a ta si toto ID natiahne. Kludne
 mozete tento lazy objekt B pouzit pri vytvarani novych dotazov. Vsetko bez
 toho, aby bol dodatocne natiahnuty! Load nastane az v momente ak pristupite
 na nejaky getter objektu B...
 2010/3/11 Roman Pichlík roman.pich...@gmail.com

  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 */




RE: hibernate a instanceOf

2010-03-11 Tema obsahu Tomas Hubalek
Nechtel jsi spis pouzit Class.isAssignableFrom? Hibernate Ti primo v
dokumentaci nezarucuje, ze kdyz mu das nejakou tridu, tak primo ji
dostanes. Hodne casto dostanes nejakeho jejich potomka.

 -Original Message-
 From: konference-boun...@java.cz 
 [mailto:konference-boun...@java.cz] On Behalf Of Ivan Polak
 Sent: Thursday, March 11, 2010 12:47 PM
 To: Java
 Subject: hibernate a instanceOf
 
 Zdravim konferenciu,
 
 mam v hibernate nasledovne objekty:
 
 objekt Customer :
 
 @Entity
 @Table(name=customer)
 @Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
 @DiscriminatorColumn(name = customer_type,
 discriminatorType=DiscriminatorType.STRING)
 public abstract class Customer extends BaseObject { 
 }
 
 a od neho odvodeny objekt Shipper:
 
 @Entity
 @DiscriminatorValue(S)
 public class Shipper extends Customer {
 ...}
 
 potrebujem pouzit nasledovny test:
 
 returnValue = Class.forName(className).isInstance(o);
 
 kde 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 (...).
 
 preco je returnValue FALSE, ked by podla mna malo byt TRUE ?
 
 dakujem
 
 Ivan
 


Re: hibernate a instanceOf

2010-03-11 Tema obsahu Kamil Podlesak
Ne často, vždy :-)
Je to základní princip fungování Hibernate.

Kamil Podlešák

2010/3/11 Tomas Hubalek tomas.huba...@onsemi.com:
 Nechtel jsi spis pouzit Class.isAssignableFrom? Hibernate Ti primo v
 dokumentaci nezarucuje, ze kdyz mu das nejakou tridu, tak primo ji
 dostanes. Hodne casto dostanes nejakeho jejich potomka.

 -Original Message-
 From: konference-boun...@java.cz
 [mailto:konference-boun...@java.cz] On Behalf Of Ivan Polak
 Sent: Thursday, March 11, 2010 12:47 PM
 To: Java
 Subject: hibernate a instanceOf

 Zdravim konferenciu,

 mam v hibernate nasledovne objekty:

 objekt Customer :

 @Entity
 @Table(name=customer)
 @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
 @DiscriminatorColumn(name = customer_type,
 discriminatorType=DiscriminatorType.STRING)
 public abstract class Customer extends BaseObject { 
 }

 a od neho odvodeny objekt Shipper:

 @Entity
 @DiscriminatorValue(S)
 public class Shipper extends Customer {
 ...}

 potrebujem pouzit nasledovny test:

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

 kde 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 (...).

 preco je returnValue FALSE, ked by podla mna malo byt TRUE ?

 dakujem

 Ivan




Re: hibernate a instanceOf

2010-03-11 Tema obsahu Roman Pichlík
 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 */


Re: hibernate a instanceOf

2010-03-11 Tema obsahu Ivan Polak
ano, lazy loading je v aplikacii zapnuty.

Ivan

2010/3/11 Roman Pichlík roman.pich...@gmail.com:
 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 */



Re: hibernate a instanceOf

2010-03-11 Tema obsahu Kamil Podlesak
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 roman.pich...@gmail.com:
 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 */



Re: hibernate a instanceOf

2010-03-11 Tema obsahu Ivan Polak
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 kamil.podle...@gmail.com:
 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 roman.pich...@gmail.com:
 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 */




Re: hibernate a instanceOf

2010-03-11 Tema obsahu Roman Pichlík
 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.

ne nesleduje. Session si drzi vlastni snapshot proti kteremu se dela
diff. Jeste jedna z metod na Session vraci proxy a to je load. Diky
tomu je mozne udelat perf. optimalizaci napriklad pri mazani.

-- 
S pozdravem Roman Dagi Pichlik

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


Re: hibernate a instanceOf

2010-03-11 Tema obsahu Ivan Polak
a zabudol som napisat ze to nepomohlo :-(

Ivan

2010/3/11 Ivan Polak ivan.po...@f4s.sk:
 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 kamil.podle...@gmail.com:
 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 roman.pich...@gmail.com:
 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 */





Re: hibernate a instanceOf

2010-03-11 Tema obsahu Vaclav Stumbauer
Nemuzete to prevest na rozhodnovani dle hodnoty discriminatoru?
Ten si muzete namapovat jako vlastnost Custommera (update=false, insert=false)
a nasledne provadet testy podle hodnoty teto vlastnosti.
Pouzivat instanceofy a spol., navic v prostredi prolezlem
proxynama, zejmena na dedicne strukture neni nejlepsi.

VS


2010/3/11 Ivan Polak ivan.po...@f4s.sk:
 a zabudol som napisat ze to nepomohlo :-(

 Ivan

 2010/3/11 Ivan Polak ivan.po...@f4s.sk:
 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 kamil.podle...@gmail.com:
 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 roman.pich...@gmail.com:
 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 */






Re: hibernate a instanceOf

2010-03-11 Tema obsahu Lukas Barton
Pro kolekce to pomoci tech proxy sleduje - a lze se dostat do zajimavych
problemu, kdyz mu tu proxy na kolekci prepiseme.

Proxy tam nebudou, pokud to zakazeme, nebo pokud se jedna o instance
nenactene pomoci Hibernatu - at uz asociovane k session dodatecne, nebo
takove, ktere dosud nejsou perzistentni.

  Lukas

2010/3/11 Roman Pichlík roman.pich...@gmail.com

  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.

 ne nesleduje. Session si drzi vlastni snapshot proti kteremu se dela
 diff. Jeste jedna z metod na Session vraci proxy a to je load. Diky
 tomu je mozne udelat perf. optimalizaci napriklad pri mazani.

 --
 S pozdravem Roman Dagi Pichlik

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



Re: hibernate a instanceOf

2010-03-11 Tema obsahu Ivan Polak
ano samozrejme mozem, len ma zaujimalo preco to nefunguje. urobil som to tak.

dakujem

Ivan

2010/3/11 Vaclav Stumbauer stum...@gmail.com:
 Nemuzete to prevest na rozhodnovani dle hodnoty discriminatoru?
 Ten si muzete namapovat jako vlastnost Custommera (update=false, insert=false)
 a nasledne provadet testy podle hodnoty teto vlastnosti.
 Pouzivat instanceofy a spol., navic v prostredi prolezlem
 proxynama, zejmena na dedicne strukture neni nejlepsi.

 VS


 2010/3/11 Ivan Polak ivan.po...@f4s.sk:
 a zabudol som napisat ze to nepomohlo :-(

 Ivan

 2010/3/11 Ivan Polak ivan.po...@f4s.sk:
 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 kamil.podle...@gmail.com:
 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 roman.pich...@gmail.com:
 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 */







Re: hibernate a instanceOf

2010-03-11 Tema obsahu Kamil Podlesak
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 ivan.po...@f4s.sk:
 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 kamil.podle...@gmail.com:
 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 roman.pich...@gmail.com:
 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 */





RE: hibernate a instanceOf

2010-03-11 Tema obsahu Tomas Hubalek
A co vlastne vraci o.getClass()?  

 -Original Message-
 From: konference-boun...@java.cz 
 [mailto:konference-boun...@java.cz] On Behalf Of Ivan Polak
 Sent: Thursday, March 11, 2010 1:54 PM
 To: Java
 Subject: Re: hibernate a instanceOf
 
 ano samozrejme mozem, len ma zaujimalo preco to nefunguje. 
 urobil som to tak.
 
 dakujem
 
 Ivan
 
 2010/3/11 Vaclav Stumbauer stum...@gmail.com:
  Nemuzete to prevest na rozhodnovani dle hodnoty discriminatoru?
  Ten si muzete namapovat jako vlastnost Custommera (update=false, 
  insert=false) a nasledne provadet testy podle hodnoty teto 
 vlastnosti.
  Pouzivat instanceofy a spol., navic v prostredi prolezlem 
 proxynama, 
  zejmena na dedicne strukture neni nejlepsi.
 
  VS
 
 
  2010/3/11 Ivan Polak ivan.po...@f4s.sk:
  a zabudol som napisat ze to nepomohlo :-(
 
  Ivan
 
  2010/3/11 Ivan Polak ivan.po...@f4s.sk:
  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 kamil.podle...@gmail.com:
  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 roman.pich...@gmail.com:
  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 */