Olmuştur bazı tartışmalar JPA varlıkları ve yaklaşık burada hashCode()
/ equals()
JPA varlık sınıfları için kullanılmalıdır uygulanması. Bunların çoğu (hepsi değilse de) Hazırda Bekleme'ye bağlıdır, ancak bunları JPA-uygulama-tarafsız olarak tartışmak istiyorum (bu arada EclipseLink kullanıyorum).
Tüm olası uygulamaların kendi avantaj ve dezavantajları vardır :
hashCode()
/equals()
Sözleşme uygunluk için (değişmezlik)List
/Set
operasyonlar- İster aynı nesneler (örneğin, farklı oturumlar lazily yüklenmiş veri yapılarının dinamik proxy) tespit edilebilir
- Varlıkların bağımsız (veya kalıcı olmayan) durumda doğru davranıp davranmadığı
Görebildiğim kadarıyla üç seçenek var :
- Onları geçersiz kılmayın; güven
Object.equals()
veObject.hashCode()
hashCode()
/equals()
iş- özdeş nesneleri, dinamik proxy'lerle ilgili sorunları tanımlayamıyor
- müstakil varlıklarla sorun yok
- Birincil anahtara göre bunları geçersiz kılın
hashCode()
/equals()
bozuk- doğru kimlik (tüm yönetilen varlıklar için)
- müstakil varlıklarla ilgili sorunlar
- Business-ID'ye (birincil olmayan anahtar alanları; yabancı anahtarlar ne olacak?)
Dayalı olarak bunları geçersiz kılın.
hashCode()
/equals()
bozuk- doğru kimlik (tüm yönetilen varlıklar için)
- müstakil varlıklarla sorun yok
Sorularım:
- Bir seçeneği ve / veya pro / con noktasını kaçırdım mı?
- Hangi seçeneği seçtiniz ve neden?
GÜNCELLEME 1:
"By hashCode()
/ equals()
kırılır", bunu izleyen demek hashCode()
(doğru bir şekilde uygulandığında zaman) anlamında kırık olmadığı, farklı değerleri döndürebilir çağırmaları Object
API belgeleri, ama bir de değişmiş varlık almaya çalışırken hangi sorunlara neden olmaktadır Map
, Set
ya da diğer karma tabanlı Collection
. Sonuç olarak, JPA uygulamaları (en azından EclipseLink) bazı durumlarda düzgün çalışmayacaktır.
GÜNCELLEME 2:
Yanıtlarınız için teşekkür ederiz - çoğu dikkate değer bir kaliteye sahiptir.
Ne yazık ki, gerçek bir uygulama için hangi yaklaşımın en iyi olacağından veya başvurum için en iyi yaklaşımın nasıl belirleneceğinden hala emin değilim. Bu yüzden, soruyu açık tutacağım ve daha fazla tartışma ve / veya görüş umuyorum.
hashcode()
, equals()
uygulamada kullanılan herhangi bir alan değişmedikçe , aynı nesne örneğini çağırmanın tersi aynı değeri döndürmesi gerektiği anlamına gelir . Başka bir deyişle, sınıfınızda üç alan varsa ve equals()
yönteminiz örneklerin eşitliğini belirlemek için bunlardan yalnızca ikisini kullanıyorsa hashcode()
, bu alanın değerlerinden birini değiştirirseniz dönüş değerinin değişmesini bekleyebilirsiniz. bu nesne örneğinin artık eski örneğin temsil ettiği değere "eşit" olmadığı anlamına gelir.