Kullanırken Hepimiz hazırda varsayılan davranışını bilmek @SequenceGenerator
- bu gerçek veritabanı dizisi arttırır biri 50 (varsayılan tarafından, birden bu değeri allocationSize
değeri) - ve sonra varlık kimliği olarak bu değeri kullanır.
Bu yanlış bir davranıştır ve şunu söyleyen spesifikasyonla çelişir :
tahsisat boyutu - (İsteğe bağlı) Sıradan sıra numaraları tahsis edilirken artırılacak miktar.
Açık olmak gerekirse: Oluşturulan kimlikler arasındaki boşluklardan rahatsız değilim.
Temel veritabanı sırasına uymayan kimlikleri önemsiyorum . Örneğin: başka herhangi bir uygulama (örneğin, düz JDBC kullanan), diziden elde edilen kimliklerin altına yeni satırlar eklemek isteyebilir - ancak tüm bu değerler zaten Hazırda Bekletme tarafından kullanılıyor olabilir! Delilik.
Birisi bu soruna herhangi bir çözüm biliyor allocationSize=1
mu (performansı ayarlamadan ve dolayısıyla performansı düşürmeden)?
DÜZENLEME:
Her şeyi netleştirmek için. Son eklenen kayıtta ID = varsa 1
, HB 51, 52, 53...
yeni varlıkları için değerleri kullanır AMA aynı zamanda: dizinin veritabanındaki değeri olarak ayarlanacaktır 2
. Diğer uygulamalar bu sırayı kullanırken kolayca hatalara yol açabilir.
Diğer taraftan: spesifikasyon, (benim anlayışıma göre) veritabanı sırasının ayarlanması gerektiğini 51
ve bu arada HB'nin aralıktaki değerleri kullanması gerektiğini söylüyor.2, 3 ... 50
GÜNCELLEME:
Steve Ebersole'un aşağıda belirtildiği gibi: benim tarafımdan açıklanan davranış (ve aynı zamanda çoğu için en sezgisel olanı) ayarlanarak etkinleştirilebilir hibernate.id.new_generator_mappings=true
.
Hepinize teşekkürler.
GÜNCELLEME 2:
Gelecekteki okuyucular için, aşağıda çalışan bir örnek bulabilirsiniz.
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERS_SEQ")
@SequenceGenerator(name = "USERS_SEQ", sequenceName = "SEQUENCE_USERS")
private Long id;
}
persistence.xml
<persistence-unit name="testPU">
<properties>
<property name="hibernate.id.new_generator_mappings" value="true" />
</properties>
</persistence-unit>
save
sıranın bir sonraki değeri için veritabanını sorgulaması gerektiğidir.
SequenceGenerator
Hibernate ile yalnızca tarafından belirtilen kimlik sayısı bittiğinde veritabanını sorgular allocationsize
. Eğer kurarsanız allocationSize = 1
o zaman nedeni hazırda sorgusu DB her ekleme için. Bu değeri değiştirin ve bitirdiniz.
hibernate.id.new_generator_mappings
Ayar gerçekten önemli. Umarım bu, kimlik numarasının neden vahşi gittiğini araştırmak için çok fazla zaman harcamak zorunda kalmamamın varsayılan ayardır.