Re: Re: hibernate hashCide a equals
dakujem vsetkym za namety a pripomienky. Ivan 2010/3/4 Lukas Barton lu...@cnawr.cz Asi nikdy neporovnavate objekty vytvorene pres konstruktor a ziskane napr. pomoci session.load. Zkuste napr. nasledujici kod: Session session=HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); Event theEvent1 = new Event(); theEvent1.setTitle(Test title); theEvent1.setDate(new Date()); Serializable eventId=session.save(theEvent1); session.getTransaction().commit(); session.close(); session=HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); Event theEvent2 = (Event) session.load(Event.class,eventId); System.out.println(EqualsBuilder.reflectionEquals(theEvent1, theEvent2)); // false session.getTransaction().commit(); session.close(); EqualsBuilder se pokusi porovnat vsechny fieldy na te proxy, tj. v mem pripade: [public static javassist.util.proxy.MethodHandler org.hibernate.tutorial.domain.Event_$$_javassist_0.default_interceptor, private javassist.util.proxy.MethodHandler org.hibernate.tutorial.domain.Event_$$_javassist_0.handler, public static javassist.util.proxy.MethodFilter org.hibernate.tutorial.domain.Event_$$_javassist_0._method_filter, private static java.lang.reflect.Method[] org.hibernate.tutorial.domain.Event_$$_javassist_0._methods_] Coz samozrejme pres new vytvoreny Event nema a vrati tedy false. Stejne tak to nebude chodit, kdyz budete mit IDcko instance assigned HIbernatem, ale zaroven budete mit business key slozenych z nejakych poli Jeden z moznych postupu je pouzit instaceOf a az pak EqualsBuilder - staci na primarni klic. Vice info viz treba: https://www.hibernate.org/109.html a http://www.jroller.com/sjivan/entry/intellij_generated_equals_breaks_hibernate Lukas 2010/3/4 Rastislav Siekel sie...@prosoft.sk Vyzerá to, že máte pravdu :-( Tak ten komentár že sa to prekastuje na spoločného predka odvolávam. Ale že to s Hibernate chodí, je stále pravda :-) Rastislav Bedo Siekel Original Message Subject: Re: hibernate hashCide a equals Date: Thu, 4 Mar 2010 10:23:45 +0100 From: Zdenek Tronicek troni...@fit.cvut.cz troni...@fit.cvut.cz Reply-To: Java konference@java.cz konference@java.cz To: Java konference@java.czkonference@java.cz Takze kdyz lhs je Object a rhs je String, tak lhsClass bude Object.class a rhsClass bude String.class. lhsClass.isInstance(rhs) vrati true (tedy testClass = Object.class) a !rhsClass.isInstance(lhs) je take true, tedy testClass = String.class. To nejak neodpovida tomu, ze se to prekastuje na spoločného predka. Z.T. -- Zdenek Tronicek FIT CTU in Prague Rastislav Siekel napsal(a): Veď preto tam ten Commons-Lang dáva takéto niečo: ... Class lhsClass = lhs.getClass(); Class rhsClass = rhs.getClass(); Class testClass; if (lhsClass.isInstance(rhs)) { testClass = lhsClass; if (!rhsClass.isInstance(lhs)) { // rhsClass is a subclass of lhsClass testClass = rhsClass; } } else if (rhsClass.isInstance(lhs)) { testClass = rhsClass; if (!lhsClass.isInstance(rhs)) { // lhsClass is a subclass of rhsClass testClass = lhsClass; } } else { // The two classes are not related. return false; } ... Čiže si to prekastuje na spoločného predka a až potom porovnáva. Pravdupovediac som to moc neštudoval, po otestovaní s Hiberanate som zistil, že všetko beží ako má a odvtedy to len používam :-) R. Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : sie...@prosoft.sk sie...@prosoft.sk mailto:sie...@prosoft.sk sie...@prosoft.sk Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 4. 3. 2010 9:43, Lukas Barton wrote: Jenom pozor, ze je v equals metode nutne pouzivat instanceof misto getClass()==. Hibernate tam totiz dava proxy a pak by to nefungovalo. Lukas Rastislav Siekel wrote: Jakrta Commons-Lang a zatiaľ ma nesklamali. Rastislav Bedo Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : sie...@prosoft.sk sie...@prosoft.sk mailto:sie...@prosoft.sk sie...@prosoft.sk Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 4. 3. 2010 6:54, Daniel Holešínský wrote: Zdravim, pouzivam generator IDE (eclipse, idea). U Hibernate si ale musite dat pozor na kolekce s atributem lazy - mimo session se jinak potkate s vyjimkou
Re: hibernate hashCide a equals
Jenom pozor, ze je v equals metode nutne pouzivat instanceof misto getClass()==. Hibernate tam totiz dava proxy a pak by to nefungovalo. Lukas Rastislav Siekel wrote: Jakrta Commons-Lang a zatiaľ ma nesklamali. Rastislav Bedo Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : sie...@prosoft.sk mailto:sie...@prosoft.sk Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 4. 3. 2010 6:54, Daniel Holešínský wrote: Zdravim, pouzivam generator IDE (eclipse, idea). U Hibernate si ale musite dat pozor na kolekce s atributem lazy - mimo session se jinak potkate s vyjimkou org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: , no session or session was closed z pri jakemkoliv pouziti eaual a hashCode (za predpokladu, ze tato kolekce je zahrnuta do vypoctu hashCode a vyhodnoceni equals) DH 2010/3/3 Ivan Polak ivan.po...@f4s.sk mailto:ivan.po...@f4s.sk Ahojte, mam otazku, co pouzivate na generovanie tychto 2 metod pre domain objecty v hibernate ? eclipse generovanie (Source/Generate hashCode() and equals() alebo pouzitie EqualsBuilder a HashCodeBuilder z projektu Jakarta Commons-Lang (http:// commons.apache.org/lang/ http://commons.apache.org/lang/ alebo nieco ine? dakujem Ivan
Re: hibernate hashCide a equals
Veď preto tam ten Commons-Lang dáva takéto niečo: ... Class lhsClass = lhs.getClass(); Class rhsClass = rhs.getClass(); Class testClass; if (lhsClass.isInstance(rhs)) { testClass = lhsClass; if (!rhsClass.isInstance(lhs)) { // rhsClass is a subclass of lhsClass testClass = rhsClass; } } else if (rhsClass.isInstance(lhs)) { testClass = rhsClass; if (!lhsClass.isInstance(rhs)) { // lhsClass is a subclass of rhsClass testClass = lhsClass; } } else { // The two classes are not related. return false; } ... Čiže si to prekastuje na spoločného predka a až potom porovnáva. Pravdupovediac som to moc neštudoval, po otestovaní s Hiberanate som zistil, že všetko beží ako má a odvtedy to len používam :-) R. Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : sie...@prosoft.sk mailto:sie...@prosoft.sk Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 4. 3. 2010 9:43, Lukas Barton wrote: Jenom pozor, ze je v equals metode nutne pouzivat instanceof misto getClass()==. Hibernate tam totiz dava proxy a pak by to nefungovalo. Lukas Rastislav Siekel wrote: Jakrta Commons-Lang a zatiaľ ma nesklamali. Rastislav Bedo Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : sie...@prosoft.sk mailto:sie...@prosoft.sk Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 4. 3. 2010 6:54, Daniel Holešínský wrote: Zdravim, pouzivam generator IDE (eclipse, idea). U Hibernate si ale musite dat pozor na kolekce s atributem lazy - mimo session se jinak potkate s vyjimkou org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: , no session or session was closed z pri jakemkoliv pouziti eaual a hashCode (za predpokladu, ze tato kolekce je zahrnuta do vypoctu hashCode a vyhodnoceni equals) DH 2010/3/3 Ivan Polak ivan.po...@f4s.sk mailto:ivan.po...@f4s.sk Ahojte, mam otazku, co pouzivate na generovanie tychto 2 metod pre domain objecty v hibernate ? eclipse generovanie (Source/Generate hashCode() and equals() alebo pouzitie EqualsBuilder a HashCodeBuilder z projektu Jakarta Commons-Lang (http:// commons.apache.org/lang/ http://commons.apache.org/lang/ alebo nieco ine? dakujem Ivan
Re: hibernate hashCide a equals
Takze kdyz lhs je Object a rhs je String, tak lhsClass bude Object.class a rhsClass bude String.class. lhsClass.isInstance(rhs) vrati true (tedy testClass = Object.class) a !rhsClass.isInstance(lhs) je take true, tedy testClass = String.class. To nejak neodpovida tomu, ze se to prekastuje na spoločného predka. Z.T. -- Zdenek Tronicek FIT CTU in Prague Rastislav Siekel napsal(a): Veď preto tam ten Commons-Lang dáva takéto niečo: ... Class lhsClass = lhs.getClass(); Class rhsClass = rhs.getClass(); Class testClass; if (lhsClass.isInstance(rhs)) { testClass = lhsClass; if (!rhsClass.isInstance(lhs)) { // rhsClass is a subclass of lhsClass testClass = rhsClass; } } else if (rhsClass.isInstance(lhs)) { testClass = rhsClass; if (!lhsClass.isInstance(rhs)) { // lhsClass is a subclass of rhsClass testClass = lhsClass; } } else { // The two classes are not related. return false; } ... Čiže si to prekastuje na spoločného predka a až potom porovnáva. Pravdupovediac som to moc neštudoval, po otestovaní s Hiberanate som zistil, že všetko beží ako má a odvtedy to len používam :-) R. Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : sie...@prosoft.sk mailto:sie...@prosoft.sk Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 4. 3. 2010 9:43, Lukas Barton wrote: Jenom pozor, ze je v equals metode nutne pouzivat instanceof misto getClass()==. Hibernate tam totiz dava proxy a pak by to nefungovalo. Lukas Rastislav Siekel wrote: Jakrta Commons-Lang a zatiaľ ma nesklamali. Rastislav Bedo Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : sie...@prosoft.sk mailto:sie...@prosoft.sk Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 4. 3. 2010 6:54, Daniel Holešínský wrote: Zdravim, pouzivam generator IDE (eclipse, idea). U Hibernate si ale musite dat pozor na kolekce s atributem lazy - mimo session se jinak potkate s vyjimkou org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: , no session or session was closed z pri jakemkoliv pouziti eaual a hashCode (za predpokladu, ze tato kolekce je zahrnuta do vypoctu hashCode a vyhodnoceni equals) DH 2010/3/3 Ivan Polak ivan.po...@f4s.sk mailto:ivan.po...@f4s.sk Ahojte, mam otazku, co pouzivate na generovanie tychto 2 metod pre domain objecty v hibernate ? eclipse generovanie (Source/Generate hashCode() and equals() alebo pouzitie EqualsBuilder a HashCodeBuilder z projektu Jakarta Commons-Lang (http:// commons.apache.org/lang/ http://commons.apache.org/lang/ alebo nieco ine? dakujem Ivan
Fwd: Re: hibernate hashCide a equals
Vyzerá to, že máte pravdu :-( Tak ten komentár že sa to prekastuje na spoločného predka odvolávam. Ale že to s Hibernate chodí, je stále pravda :-) Rastislav Bedo Siekel Original Message Subject:Re: hibernate hashCide a equals Date: Thu, 4 Mar 2010 10:23:45 +0100 From: Zdenek Tronicek troni...@fit.cvut.cz Reply-To: Java konference@java.cz To: Java konference@java.cz Takze kdyz lhs je Object a rhs je String, tak lhsClass bude Object.class a rhsClass bude String.class. lhsClass.isInstance(rhs) vrati true (tedy testClass = Object.class) a !rhsClass.isInstance(lhs) je take true, tedy testClass = String.class. To nejak neodpovida tomu, ze se to prekastuje na spoločného predka. Z.T. -- Zdenek Tronicek FIT CTU in Prague Rastislav Siekel napsal(a): Veď preto tam ten Commons-Lang dáva takéto niečo: ... Class lhsClass = lhs.getClass(); Class rhsClass = rhs.getClass(); Class testClass; if (lhsClass.isInstance(rhs)) { testClass = lhsClass; if (!rhsClass.isInstance(lhs)) { // rhsClass is a subclass of lhsClass testClass = rhsClass; } } else if (rhsClass.isInstance(lhs)) { testClass = rhsClass; if (!lhsClass.isInstance(rhs)) { // lhsClass is a subclass of rhsClass testClass = lhsClass; } } else { // The two classes are not related. return false; } ... Čiže si to prekastuje na spoločného predka a až potom porovnáva. Pravdupovediac som to moc neštudoval, po otestovaní s Hiberanate som zistil, že všetko beží ako má a odvtedy to len používam :-) R. Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail :sie...@prosoft.sk mailto:sie...@prosoft.sk Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 4. 3. 2010 9:43, Lukas Barton wrote: Jenom pozor, ze je v equals metode nutne pouzivat instanceof misto getClass()==. Hibernate tam totiz dava proxy a pak by to nefungovalo. Lukas Rastislav Siekel wrote: Jakrta Commons-Lang a zatiaľ ma nesklamali. Rastislav Bedo Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail :sie...@prosoft.sk mailto:sie...@prosoft.sk Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 4. 3. 2010 6:54, Daniel Holešínský wrote: Zdravim, pouzivam generator IDE (eclipse, idea). U Hibernate si ale musite dat pozor na kolekce s atributem lazy - mimo session se jinak potkate s vyjimkou org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: , no session or session was closed z pri jakemkoliv pouziti eaual a hashCode (za predpokladu, ze tato kolekce je zahrnuta do vypoctu hashCode a vyhodnoceni equals) DH 2010/3/3 Ivan Polakivan.po...@f4s.skmailto:ivan.po...@f4s.sk Ahojte, mam otazku, co pouzivate na generovanie tychto 2 metod pre domain objecty v hibernate ? eclipse generovanie (Source/Generate hashCode() and equals() alebo pouzitie EqualsBuilder a HashCodeBuilder z projektu Jakarta Commons-Lang (http:// commons.apache.org/lang/http://commons.apache.org/lang/ alebo nieco ine? dakujem Ivan
Re: Re: hibernate hashCide a equals
Asi nikdy neporovnavate objekty vytvorene pres konstruktor a ziskane napr. pomoci session.load. Zkuste napr. nasledujici kod: Session session=HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); Event theEvent1 = new Event(); theEvent1.setTitle(Test title); theEvent1.setDate(new Date()); Serializable eventId=session.save(theEvent1); session.getTransaction().commit(); session.close(); session=HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); Event theEvent2 = (Event) session.load(Event.class,eventId); System.out.println(EqualsBuilder.reflectionEquals(theEvent1, theEvent2)); // false session.getTransaction().commit(); session.close(); EqualsBuilder se pokusi porovnat vsechny fieldy na te proxy, tj. v mem pripade: [public static javassist.util.proxy.MethodHandler org.hibernate.tutorial.domain.Event_$$_javassist_0.default_interceptor, private javassist.util.proxy.MethodHandler org.hibernate.tutorial.domain.Event_$$_javassist_0.handler, public static javassist.util.proxy.MethodFilter org.hibernate.tutorial.domain.Event_$$_javassist_0._method_filter, private static java.lang.reflect.Method[] org.hibernate.tutorial.domain.Event_$$_javassist_0._methods_] Coz samozrejme pres new vytvoreny Event nema a vrati tedy false. Stejne tak to nebude chodit, kdyz budete mit IDcko instance assigned HIbernatem, ale zaroven budete mit business key slozenych z nejakych poli Jeden z moznych postupu je pouzit instaceOf a az pak EqualsBuilder - staci na primarni klic. Vice info viz treba: https://www.hibernate.org/109.html a http://www.jroller.com/sjivan/entry/intellij_generated_equals_breaks_hibernate Lukas 2010/3/4 Rastislav Siekel sie...@prosoft.sk Vyzerá to, že máte pravdu :-( Tak ten komentár že sa to prekastuje na spoločného predka odvolávam. Ale že to s Hibernate chodí, je stále pravda :-) Rastislav Bedo Siekel Original Message Subject: Re: hibernate hashCide a equals Date: Thu, 4 Mar 2010 10:23:45 +0100 From: Zdenek Tronicek troni...@fit.cvut.cz troni...@fit.cvut.cz Reply-To: Java konference@java.cz konference@java.cz To: Java konference@java.czkonference@java.cz Takze kdyz lhs je Object a rhs je String, tak lhsClass bude Object.class a rhsClass bude String.class. lhsClass.isInstance(rhs) vrati true (tedy testClass = Object.class) a !rhsClass.isInstance(lhs) je take true, tedy testClass = String.class. To nejak neodpovida tomu, ze se to prekastuje na spoločného predka. Z.T. -- Zdenek Tronicek FIT CTU in Prague Rastislav Siekel napsal(a): Veď preto tam ten Commons-Lang dáva takéto niečo: ... Class lhsClass = lhs.getClass(); Class rhsClass = rhs.getClass(); Class testClass; if (lhsClass.isInstance(rhs)) { testClass = lhsClass; if (!rhsClass.isInstance(lhs)) { // rhsClass is a subclass of lhsClass testClass = rhsClass; } } else if (rhsClass.isInstance(lhs)) { testClass = rhsClass; if (!lhsClass.isInstance(rhs)) { // lhsClass is a subclass of rhsClass testClass = lhsClass; } } else { // The two classes are not related. return false; } ... Čiže si to prekastuje na spoločného predka a až potom porovnáva. Pravdupovediac som to moc neštudoval, po otestovaní s Hiberanate som zistil, že všetko beží ako má a odvtedy to len používam :-) R. Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : sie...@prosoft.sk sie...@prosoft.sk mailto:sie...@prosoft.sk sie...@prosoft.sk Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 4. 3. 2010 9:43, Lukas Barton wrote: Jenom pozor, ze je v equals metode nutne pouzivat instanceof misto getClass()==. Hibernate tam totiz dava proxy a pak by to nefungovalo. Lukas Rastislav Siekel wrote: Jakrta Commons-Lang a zatiaľ ma nesklamali. Rastislav Bedo Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : sie...@prosoft.sk sie...@prosoft.sk mailto:sie...@prosoft.sk sie...@prosoft.sk Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 4. 3. 2010 6:54, Daniel Holešínský wrote: Zdravim, pouzivam generator IDE (eclipse, idea). U Hibernate si ale musite dat pozor na kolekce s atributem lazy - mimo session se jinak potkate s vyjimkou org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: , no session or session was closed z pri
Re: hibernate hashCide a equals
Zdravim, pouzivam generator IDE (eclipse, idea). U Hibernate si ale musite dat pozor na kolekce s atributem lazy - mimo session se jinak potkate s vyjimkou org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: , no session or session was closed z pri jakemkoliv pouziti eaual a hashCode (za predpokladu, ze tato kolekce je zahrnuta do vypoctu hashCode a vyhodnoceni equals) DH 2010/3/3 Ivan Polak ivan.po...@f4s.sk Ahojte, mam otazku, co pouzivate na generovanie tychto 2 metod pre domain objecty v hibernate ? eclipse generovanie (Source/Generate hashCode() and equals() alebo pouzitie EqualsBuilder a HashCodeBuilder z projektu Jakarta Commons-Lang (http:// commons.apache.org/lang/ alebo nieco ine? dakujem Ivan
Re: hibernate hashCide a equals
Jakrta Commons-Lang a zatiaľ ma nesklamali. Rastislav Bedo Siekel Ing. Rastislav Siekel Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia E-mail : sie...@prosoft.sk mailto:sie...@prosoft.sk Tel : 041/562 54 91 Fax : 041/562 54 97 Mobil : 0905 34 00 20 On 4. 3. 2010 6:54, Daniel Holešínský wrote: Zdravim, pouzivam generator IDE (eclipse, idea). U Hibernate si ale musite dat pozor na kolekce s atributem lazy - mimo session se jinak potkate s vyjimkou org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: , no session or session was closed z pri jakemkoliv pouziti eaual a hashCode (za predpokladu, ze tato kolekce je zahrnuta do vypoctu hashCode a vyhodnoceni equals) DH 2010/3/3 Ivan Polak ivan.po...@f4s.sk mailto:ivan.po...@f4s.sk Ahojte, mam otazku, co pouzivate na generovanie tychto 2 metod pre domain objecty v hibernate ? eclipse generovanie (Source/Generate hashCode() and equals() alebo pouzitie EqualsBuilder a HashCodeBuilder z projektu Jakarta Commons-Lang (http:// commons.apache.org/lang/ http://commons.apache.org/lang/ alebo nieco ine? dakujem Ivan