Hazırda Bekletme Otomatik Artış Kimliği


86

Ek açıklama ile hazırda bekletme kullanan bir j2ee uygulamam var. Pojo sınıfımdaki Id alanına, otomatik artış veya otomatik oluşturulmuş olarak ayarlamak için nasıl açıklama ekleyebilirim? ve fasulyeyi eklerken o alanı fasulyemde boş bırakır mıyım?

Yanıtlar:


161
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

ve ısrar ederken onu null( 0) bırakırsınız . ( nullKullanırsanız Integer/ Longsarmalayıcılarını)

Bazı durumlarda AUTOstrateji, veya yerine SEQUENCErathen olarak çözümlenir , bu nedenle manuel olarak veya (temel alınan veritabanına bağlı olarak) olarak ayarlamak isteyebilirsiniz .IDENTITYTABLEIDENTITYTABLE

Sizin için çalışan sıra adını belirtenSEQUENCE + görünüyor .


benim kimliğim string türünde. ona ne ayarlayacağım. Çünkü bu hatayı alıyorum. Nedeni: javax.el.ELException: org.hibernate.exception.SQLGrammarException: sonraki sıra değeri alınamadı
cedric

4
otomatik artış, artan bir sayı olduğu anlamına gelir. Bir Dize artırılamaz. Sütun
tanıtımını

Veritabanındaki myid sütunu tip numarasıdır. Ve pojo'mdaki kimliğimi int olarak değiştirdim. hata dizisi yok
cedric

2
Oracle için SEQUENCE, otomatik artırmaya en yakın şeydir. Hazırda Bekletme'nin şemanızı oluşturmasına izin vermedikçe, diziyi önceden oluşturmanız gerekir. Bir noktada birden fazla veritabanını destekleyebileceğinizi düşünüyorsanız, TABLE'yi kullanın.
Brian Deterling

2
Kimliği kullanmayın, Oracle kimliği desteklemez, sıralamayı destekler.
JuanZe

33

Aşağıdaki gibi yapın: -

@Id
@GenericGenerator(name="kaugen" , strategy="increment")
@GeneratedValue(generator="kaugen")
@Column(name="proj_id")
  public Integer getId() {
    return id;
 }

Kaugen yerine herhangi bir keyfi isim kullanabilirsiniz. İyi çalıştı, konsolda aşağıdaki sorguları görebiliyordum

Hibernate: select max(proj_id) from javaproj
Hibernate: insert into javaproj (AUTH_email, AUTH_firstName, AUTH_lastName, projname,         proj_id) values (?, ?, ?, ?, ?)

Bu benim için çalışıyor. Ama kimlik değerini belirlememe izin vermiyor. ID'yi tamsayı veya int ile ayarlamaya çalıştım, ancak her zaman max kullanıyor. Ne yapmalıyım?
desudesudesu

@GenericGenerator (name = "incrementId", strateji = "atanmış") @GeneratedValue (generator = "incrementId") kullanın. Bu, kendi kimliğinizi ayarlamanıza izin verir, ancak kimliği geçirmezseniz 0 olacaktır.
Ravi Kant

@Kaushik Lele Strateji = "artış" hazırda bekletme dahili artım straterjisi mi? Bu SIRALAMA, KİMLİK, OTOMATİK, TABLO'lardan hangilerine giriyor?
iyi hissedin ve programlama

Tablodaki 700 milyon kayda ne dersiniz? Sanırım endeks olmadan sorun bu olabilir
user2171669

10

Bilginize

Net fasulyeleri kullanma veritabanından Yeni Varlık Sınıfları bir ile mysql , * auto_increment * kolon size aşağıdaki ek açıklamalar içeren bir özellik oluşturur:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
@NotNull
private Integer id;

Bu bana sütunun boş olmaması gerektiğini söyleyen bir hatayı alıyordu, bu yüzden @NotNull anotasyonunu null niteliğini bırakarak kaldırdım ve işe yarıyor!


7

Hazırda bekletme, beş tür tanımlayıcı oluşturma stratejisi tanımlar:

OTO - temel alınan DB'ye bağlı olarak kimlik sütunu, sıra veya tablo

TABLO - kimliği tutan tablo

IDENTITY - kimlik sütunu

SEQUENCE - sıra

kimlik kopyası - kimlik başka bir varlıktan kopyalanır

Tablo kullanarak örnek

@Id
@GeneratedValue(strategy=GenerationType.TABLE , generator="employee_generator")
@TableGenerator(name="employee_generator", 
                table="pk_table", 
                pkColumnName="name", 
                valueColumnName="value",                            
                allocationSize=100) 
@Column(name="employee_id")
private Long employeeId;

daha fazla ayrıntı için bağlantıya bakın .


5

Otomatik olarak artırmak istediğiniz sayısal bir sütununuz varsa, columnDefinitiondoğrudan ayarlamak bir seçenek olabilir . Bu, şema hazırda bekletme olmadan kullanılsa bile değeri otomatik olarak oluşturması avantajına sahiptir. Bu, kodunuzu db'ye özgü hale getirebilir:

import javax.persistence.Column;
@Column(columnDefinition = "serial") // postgresql

MySQL @Column (columnDefinition = "integer auto_increment")
yeralin

1

PK Seri türü olduğunda Informix tablosu için stratejiler ararken bu SO sorusundaki herhangi birinin "çarpması" durumunda .

Bunun işe yaradığını buldum ... bir örnek olarak.

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "special_serial_pk")
private Integer special_serial_pk;

Bunun çalışması için, session.SaveOrUpdate yaptığınızda özel_serial_pk NULL sütununun değerini ilettiğinizden emin olun .

Benim durumumda JSON ile böyle bir HTML POST yapıyorum ...

{
"special_serial_pk": null, //<-- Field to be incremented
"specialcolumn1": 1,
"specialcolumn2": "I love to code",
"specialcolumn3": true
}

0

Netbeans Veritabanından Yeni Varlık Sınıflarını bir mysql auto_increment sütunuyla kullanmak, aşağıdaki hibernate.hbm.xml ile bir öznitelik oluşturur: id, otomatik artış

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.