SORU
17 ŞUBAT 2011, PERŞEMBE


JPA, hashCode() / equals() ikilem

hashCode()/equals() Uygulama JPA varlık sınıfları için kullanılan JPA varlık hakkında burada ve 21* discussions *olmuştur. Çoğu (hepsi değilse de) onları Hazırda bağlı, ama onları JPA-uygulama-tarafsız (EclipseLink, bu arada ben kullanıyorum) tartışmak isterim.

Mümkün olan tüm uygulamaları kendi veriyoruzavantajlarıvedezavantajlarıilgili:

  • hashCode()/equals()sözleşmeuygunluk(değişmezliğini tanıdı) 5* List/*işlemleri için
  • Olsunaynınesneleri (tembel yüklenen bir veri yapıları farklı oturumları, dinamik vekiller gibi) tespit edilebilir
  • Olsun varlıkları doğru hareketmüstakil (ya da olmayan kalıcı) devlet

Bildiğim kadarıyla görebiliyorumüç seçenek var:

  1. Onları geçersiz kılma; Object.equals() Object.hashCode()güvenmeyin
    • hashCode()/equals()
    • olamaz aynı nesneleri tanımlamak, dinamik vekiller ile ilgili sorunlar
    • müstakil varlıkları ile sorun yok
  2. Onlara göre geçersiz kılarbirincil anahtar
    • hashCode()/equals() kırık
    • kimlik (tüm yönetilen varlıklar için) doğru
    • müstakil varlıkları ile ilgili sorunlar
  3. Onlara göre geçersiz kılarİş Kimliğiyabancı anahtarları ne olacak? (non-birincil anahtar alanlar;)
    • hashCode()/equals() kırık
    • kimlik (tüm yönetilen varlıklar için) doğru
    • müstakil varlıkları ile sorun yok

Benim sorular şunlardır:

  1. Bir seçenek ve/veya pro/con noktayı kaçırdım mı?
  2. Seçenek ve neden tercih ettiniz?



GÜNCELLEME 1:

"hashCode()/equals() kırıldı", yani art arda hashCode() çağırmaları döndürebilir farklı değerleri olan (doğru uygulanan) kırık hissi Object API belgelerine, ama hangi sorunlara neden olur çalışırken almak için değişmiş bir varlık Map, Set veya başka bir hash tabanlı Collection. Sonuç olarak, JPA uygulamaları (en azından EclipseLink), bazı durumlarda doğru çalışmaz.

GÜNCELLEME 2:

Olağanüstü kalite En cevaplarınız için teşekkür ederim.
Ne yazık ki, hala gerçek bir uygulama için en iyi olacak, ya da benim uygulama için en iyi yaklaşım belirlemek için nasıl emin değilim. O yüzden bu soruya açık tutmak ve biraz daha tartışma ve/veya görüş için umut edeceğim.

CEVAP
17 ŞUBAT 2011, PERŞEMBE


Ben her zaman/hashcode eşittir geçersiz kılmak ve iş kimliğine dayanarak uygulamak. Anlaşılan benim için en makul çözüm. Aşağıdaki link bkz.

Bütün bunları özetlemek gerekirse, burada çalışacak veya farklı şekillerde işlemek için işe yaramaz ne listesi/hashCode eşittir: enter image description here

EDİT:

Bu benim için çalışıyor neden açıklamak için:

  1. Genellikle karma tabanlı koleksiyon (HashMap/HashSet) JPA benim uygulamada kullanmıyorum. Eğer gerekirse, UniqueList çözüm oluşturmak için tercih ederim.
  2. Çalışma zamanı, iş kimliği, değişen herhangi bir veritabanı uygulaması için en iyi yöntem değil bence. Başka çözüm yok nadir durumlarda, öğe kaldırmak ve karma tabanlı koleksiyon için geri koymak gibi özel muamele yaparım.
  3. Benim model için, yapıcı iş kimliğini belirledim ve bunun için belirleyiciler sağlamaz. JPA uygulama değiştirmek için izin verdimalanözelliği yerine.
  4. UUID çözüm overkill gibi görünüyor. Eğer doğal iş kimliği varsa neden UUID? Sonuçta veritabanında iş kimliği teklik söyleyebilirim. EttiriyorÜÇveritabanındaki her tablo için dizin?

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Google Developers

    Google Devel

    23 AĞUSTOS 2007
  • Matt Steffanina

    Matt Steffan

    1 EYLÜL 2011
  • Stevie

    Stevie

    2 Mayıs 2010