JPA ve Hazırda Bekletme kullanılırken kimlik oluşturma stratejisi nasıl seçilir


102

Hazırda Bekletme başvuru kılavuzunun Kimlik oluşturma bölümünü ve "Hazırda Bekletme ile java kalıcılığını" inceliyordum

Hibernate ve JPA ile birlikte kullanılabilen epeyce seçenek var.

Belirli bir kimlik oluşturma stratejisinin nasıl seçileceğine dair daha fazla belge arıyordum.

Ayrıca devrilme noktaları arıyorum.

Örneğin hilo stratejisinin çekişmeyi azaltması bekleniyor. Bu seçimle ilişkili bir değiş tokuş olması gerektiğini varsayıyorum.

Değiş tokuşlar hakkında eğitim almak istiyorum.

Herhangi bir literatür var mı?

Yanıtlar:


92

API Doktor bu konuda çok net.

Tüm oluşturucular org.hibernate.id.IdentifierGenerator arayüzünü uygular. Bu çok basit bir arayüz. Bazı uygulamalar kendi özel uygulamalarını sağlamayı seçebilir, ancak Hibernate bir dizi yerleşik uygulama sağlar. Yerleşik oluşturucular için kısayol adları aşağıdaki gibidir:

artış

yalnızca başka hiçbir işlem aynı tabloya veri eklemediğinde benzersiz olan long, short veya int türünde tanımlayıcılar üretir. Bir kümede kullanmayın.

Kimlik

DB2, MySQL, MS SQL Server, Sybase ve HypersonicSQL'de kimlik sütunlarını destekler. Döndürülen tanımlayıcı long, short veya int türündedir.

sıra

DB2, PostgreSQL, Oracle, SAP DB, McKoi'de bir dizi veya Interbase'de bir oluşturucu kullanır. Döndürülen tanımlayıcı uzun, kısa veya int türündedir

Hilo

hi değerlerinin kaynağı olarak bir tablo ve sütun (varsayılan olarak sırasıyla hibernate_unique_key ve next_hi) verildiğinde long, short veya int türünde tanımlayıcıları verimli bir şekilde üretmek için bir hi / lo algoritması kullanır. Hi / lo algoritması, yalnızca belirli bir veritabanı için benzersiz olan tanımlayıcılar üretir.

Seqhilo

Uzun, kısa veya int türünde tanımlayıcıları verimli bir şekilde oluşturmak için, adlandırılmış bir veritabanı dizisi verildiğinde bir hi / lo algoritması kullanır.

uuid

bir ağ içinde benzersiz olan dizge türü tanımlayıcıları oluşturmak için 128 bit UUID algoritması kullanır (IP adresi kullanılır). UUID, uzunluk olarak 32 onaltılık basamaktan oluşan bir dize olarak kodlanmıştır.

rehberlik

MS SQL Server ve MySQL üzerinde veritabanı tarafından üretilen bir GUID dizesi kullanır.

yerli

temel alınan veritabanının yeteneklerine bağlı olarak kimlik, sıra veya hilo seçer.

atanmış

save () çağrılmadan önce uygulamanın nesneye bir tanımlayıcı atamasına izin verir. Hiçbir öğe belirtilmezse bu varsayılan stratejidir.

seç

Bir veritabanı tetikleyicisi tarafından atanan birincil anahtarı, sırayı benzersiz bir anahtarla seçerek ve birincil anahtar değerini alarak alır.

Dış

başka bir ilişkili nesnenin tanımlayıcısını kullanır. Genellikle bir birincil anahtar ilişkisi ile birlikte kullanılır.

sıra kimliği

gerçek değer üretimi için bir veritabanı dizisi kullanan, ancak bunu, üretilen tanımlayıcı değerini insert deyimi yürütmesinin bir parçası olarak döndürmek için JDBC3 getGeneratedKeys ile birleştiren özel bir dizi oluşturma stratejisi. Bu strateji yalnızca JDK 1.4 için hedeflenen Oracle 10g sürücülerinde desteklenir. Oracle sürücülerindeki bir hata nedeniyle bu insert ifadeleriyle ilgili yorumlar devre dışı bırakıldı.

Çok fazla eşzamanlı kullanıcı olmayan basit bir uygulama oluşturuyorsanız, artırma, kimlik, hilo vb.

Veritabanınıza bağlı olarak sıra veya rehber seçmelisiniz . Bunlar güvenli ve daha iyidir çünkü idnesil veri tabanının içinde gerçekleşecektir.

Güncelleme: Son zamanlarda, ilkel tipin (int) bunun yerine warapper türü (Tamsayı) kullanılarak düzeltildiği idendity ile ilgili bir sorun yaşadık.


Cevabınız için çok teşekkür ederim. Zaten dokümanlara baktım. Bununla birlikte, insanların neden hilo ve seqhilo gibi bir şey kullandığını arıyorum. Bu seçimi ne zaman yapacağız? Select için kullanım durumları nelerdir?

Sıra veya kılavuz kadar basit bir şey olduğunda, geliştiricinin başka yolları seçmesini ne gerektirebilir.

1
Cevabımı güncelledim. Aslında artış, kimlik, hilo vb .. daha basittir. ancak kurumsal uygulamalar için uygun değillerdir. Tüm seçenekleri korumak sorun değil, ancak sizin için en uygun olanı kullandığınızdan emin olun!
ManuPK

Evet. Şimdiye kadar oy verme veya kabul etme ayrıcalığına sahip değildim.

Daha fazla ayrıntıya dalmaya bakıyorum, zamanınız varsa bana bildirin.

45

Temel olarak, iki ana seçeneğiniz var:

  • Tanımlayıcıyı kendiniz oluşturabilirsiniz, bu durumda atanmış bir tanımlayıcı kullanabilirsiniz .
  • @GeneratedValueEk açıklamayı kullanabilirsiniz ve Hazırda Bekletme sizin için tanımlayıcıyı atar.

Oluşturulan tanımlayıcılar için iki seçeneğiniz vardır:

Sayısal tanımlayıcılar için üç seçeneğiniz vardır :

  • KİMLİK
  • SIRA
  • TABLO

KİMLİK, JDBC toplu güncellemelerini devre dışı bıraktığı için yalnızca SEQUENCE'ı (örneğin MySQL) kullanamadığınızda iyi bir seçimdir .

SEQUENCE, özellikle havuzlanmış veya havuzlanmış-lo gibi bir tanımlayıcı iyileştirici ile kullanıldığında tercih edilen seçenektir .

TABLO, tanımlayıcıyı ve kötü ölçeklenen satır düzeyinde kilitleri almak için ayrı bir işlem kullandığından, ne pahasına olursa olsun kaçınılmalıdır .


20


Bir süre önce Hazırda Bekletme anahtar üreteçleri hakkında ayrıntılı bir makale yazdım: http://blog.eyallupu.com/2011/01/hibernatejpa-identity-generators.html

Doğru oluşturucuyu seçmek karmaşık bir iştir, ancak bunu mümkün olan en kısa sürede düzeltmeye çalışmak önemlidir - geç bir geçiş bir kabus olabilir.

Biraz konu dışı, ancak uygulamalar arasında anahtarların paylaşıldığı (API aracılığıyla) genellikle gözden kaçan bir noktayı yükseltmek için iyi bir şans. Şahsen ben her zaman vekil anahtarları tercih ederim ve nesnelerimi diğer sistemlerle iletişim kurmam gerekirse, anahtarımı ifşa etmiyorum (bu bir vekil olsa bile) - ek bir 'harici anahtar' kullanıyorum. Bir danışman olarak, bir veya iki yıl sonra bir tarafın anahtar aralıkla veya başka bir şeyle ilgili sorunları olduğunu bulmak için nesne anahtarlarını kullanan birden fazla 'harika' sistem entegrasyonları gördüm ('oradayım, sadece kullanalım' yaklaşımı). iç anahtarlarını açığa çıkaran sistem üzerinde derin bir geçiş gerektiren tür. Anahtarınızı açığa çıkarmak, kodunuzun temel bir yönünü dış kısıtlamalara gerçekten maruz bırakmamak anlamına gelir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.