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 <[email protected]>
> 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
> <[email protected]> <[email protected]> Reply-To: Java
> <[email protected]> <[email protected]> To: Java
> <[email protected]><[email protected]>
>
>
> 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 : <[email protected]> <[email protected]> <mailto:[email protected]>
> > <[email protected]>
> > 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 : <[email protected]> <[email protected]>
> >>> <mailto:[email protected]> <[email protected]>
> >>> 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 <[email protected] <mailto:[email protected]>
> >>>> <[email protected]>>
> >>>>
> >>>> 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/>
> >>>> <http://commons.apache.org/lang/> alebo
> >>>> nieco ine?
> >>>>
> >>>> dakujem
> >>>>
> >>>> Ivan
> >>>>
> >>>>
> >>
> >
>
>
>