Ik loop bij het overriden van de Object.equals() methode in combinatie met Hibernate tegen een catch-22 situatie aan, waar ik even geen elegante oplossing voor zie. De code in kwestie is niet heel erg relevant, maar waar het op neer komt:
- In de equals() methode ben ik gewend om type-checking uit te voeren door het vergelijken van de resultaten die Object.getClass() retourneren, i.p.v. de instanceof operator te gebruiken, zodat er altijd aan de symmetrie eis uit het equals() contract voldaan wordt.
- Wanneer ik een object, die over een dergelijke implementatie van equals() beschikt, gebruik in een HashMap die ik met Hibernate persisteer, dan retourneert de equals() methode altijd false. Hibernate vult, bij het ophalen van een Map implementatie, die Map met Proxy objecten. Wanneer ik dan een get() aanroep op die Map worden de key objecten van type MyObjectProxy, via de euqlas() methode, vergeleken met een MyObject instantie die als parameter wordt meegegeven. Die zijn volgens bovenstaande definitie (getClass() vergelijking) dus niet gelijk.
- Wanneer ik dit oplos door toch de instanceof operator te gebruiken, zou ik de klasse in kwestie het liefst final willen declareren, zodat er geen subklassen gemaakt kunnen worden, die de symmetrie eis van equals() kunnen verstoren. Echter, dan kan ik de klasse weer niet als key in een lazy Hibernate collection gebruiken, omdat Hibernate er een subklasse van moet kunnnen maken: het Proxy object.
Ik loop dus altijd tegen een muur aan, ongeacht welk alternatief ik kies. Zie ik de oplossing over het hoofd of moet ik concessies doen?
- In de equals() methode ben ik gewend om type-checking uit te voeren door het vergelijken van de resultaten die Object.getClass() retourneren, i.p.v. de instanceof operator te gebruiken, zodat er altijd aan de symmetrie eis uit het equals() contract voldaan wordt.
- Wanneer ik een object, die over een dergelijke implementatie van equals() beschikt, gebruik in een HashMap die ik met Hibernate persisteer, dan retourneert de equals() methode altijd false. Hibernate vult, bij het ophalen van een Map implementatie, die Map met Proxy objecten. Wanneer ik dan een get() aanroep op die Map worden de key objecten van type MyObjectProxy, via de euqlas() methode, vergeleken met een MyObject instantie die als parameter wordt meegegeven. Die zijn volgens bovenstaande definitie (getClass() vergelijking) dus niet gelijk.
- Wanneer ik dit oplos door toch de instanceof operator te gebruiken, zou ik de klasse in kwestie het liefst final willen declareren, zodat er geen subklassen gemaakt kunnen worden, die de symmetrie eis van equals() kunnen verstoren. Echter, dan kan ik de klasse weer niet als key in een lazy Hibernate collection gebruiken, omdat Hibernate er een subklasse van moet kunnnen maken: het Proxy object.
Ik loop dus altijd tegen een muur aan, ongeacht welk alternatief ik kies. Zie ik de oplossing over het hoofd of moet ik concessies doen?