Hibernate Auto Increment ID

86

Saya memiliki aplikasi j2ee menggunakan hibernate dengan penjelasan. Bagaimana cara membuat anotasi bidang Id di kelas pojo saya untuk menyetelnya sebagai kenaikan otomatis atau dibuat otomatis. dan dalam menambahkan kacang apakah saya membiarkan bidang itu di kacang saya null?

cedric
sumber

Jawaban:

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

dan Anda meninggalkannya null( 0) saat bertahan. ( nulljika Anda menggunakan Integer/ Longwrappers)

Dalam beberapa kasus, AUTOstrategi diselesaikan ke SEQUENCErathen daripada ke IDENTITYatau TABLE, jadi Anda mungkin ingin menyetelnya secara manual ke IDENTITYatau TABLE(bergantung pada database yang mendasari).

Tampaknya SEQUENCE+ menentukan nama urutan berhasil untuk Anda.

Bozho
sumber
id saya bertipe string. apa yang akan saya atur untuk itu. Karena saya mendapatkan kesalahan ini. Disebabkan oleh: javax.el.ELException: org.hibernate.exception.SQLGrammarException: tidak bisa mendapatkan nilai urutan berikutnya
cedric
4
autoincrement berarti angka yang bertambah. String tidak bisa bertambah. Buat kolom menjadi int
Bozho
kolom myid di database adalah tipe number. Dan saya sudah mengubah id saya di pojo saya menjadi int. saya mendapatkan urutan kesalahan tidak ada
cedric
2
Untuk Oracle, SEQUENCE adalah hal yang paling mendekati autoincrement. Anda harus membuat urutan sebelumnya kecuali Anda membiarkan Hibernate menghasilkan skema Anda. Jika Anda berpikir Anda mungkin mendukung banyak database di beberapa titik, gunakan TABLE.
Brian Deterling
2
Jangan gunakan identitas, Oracle tidak mendukung identitas, mendukung urutan.
JuanZe
33

Lakukan sebagai berikut: -

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

Anda dapat menggunakan nama sembarang selain kaugen. Ini bekerja dengan baik, saya bisa melihat kueri di bawah ini di konsol

Hibernate: select max(proj_id) from javaproj
Hibernate: insert into javaproj (AUTH_email, AUTH_firstName, AUTH_lastName, projname,         proj_id) values (?, ?, ?, ?, ?)
Kaushik Lele
sumber
Yang ini berhasil untuk saya. Tapi jangan biarkan saya menetapkan nilai ID. Saya mencoba setID dengan integer atau int, tetapi menggunakan max kapan saja. Apa yang harus saya lakukan?
desudesudesu
gunakan @GenericGenerator (name = "incrementId", strategy = "assign") @GeneratedValue (generator = "incrementId"). Ini akan memungkinkan Anda menyetel id sendiri. Tetapi jika Anda tidak meneruskan id maka itu akan menjadi 0.
Ravi Kant
@Kikik Lele Apakah strategi = "increment" hibernate strategi peningkatan inbuilt? Apakah itu berasal dari URUTAN, IDENTITAS, OTOMATIS, TABEL yang mana?
Merasa baik dan memprogram
Bagaimana 700 juta catatan dalam tabel? Saya pikir ini bisa menjadi masalah tanpa indeks
user2171669
10

FYI

Menggunakan Netbeans Kelas Entitas Baru dari Database dengan kolom mysql * auto_increment *, membuat Anda atribut dengan anotasi berikut:

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

Ini membuat saya mendapatkan kesalahan yang sama yang mengatakan kolom tidak boleh null, jadi saya cukup menghapus anotasi @NotNull meninggalkan atribut null, dan berhasil!

jmoreira
sumber
7

Hibernate mendefinisikan lima jenis strategi pembuatan pengenal:

AUTO - baik kolom identitas, urutan atau tabel tergantung pada DB yang mendasarinya

TABLE - tabel berisi id

IDENTITAS - kolom identitas

SEQUENCE - urutan

salinan identitas - identitas disalin dari entitas lain

Contoh menggunakan Tabel

@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;

untuk lebih jelasnya, periksa tautannya .

pengguna2530633
sumber
5

Jika Anda memiliki kolom numerik yang ingin Anda tambahkan secara otomatis, ini mungkin opsi untuk disetel columnDefinitionsecara langsung. Ini memiliki keuntungan, bahwa skema menghasilkan nilai secara otomatis meskipun digunakan tanpa hibernasi. Ini mungkin membuat kode Anda spesifik untuk db:

import javax.persistence.Column;
@Column(columnDefinition = "serial") // postgresql
alfonx.dll
sumber
MySQL adalah @Column (columnDefinition = "integer auto_increment")
yeralin
1

Jika ada yang "menabrak" pertanyaan SO ini dalam mencari strategi untuk tabel Informix saat PK bertipe Serial .

Saya telah menemukan bahwa ini berfungsi ... sebagai contoh.

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

Untuk bekerja ini pastikan ketika Anda melakukan session.SaveOrUpdate Anda mengirimkan nilai untuk kolom special_serial_pk NULL .

Dalam kasus saya, saya melakukan HTML POST dengan JSON seperti ...

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

Menggunakan Netbeans Kelas Entitas Baru dari Database dengan kolom mysql auto_increment , membuat Anda atribut dengan hibernate.hbm.xml berikut: id is auto increment

Ankur Patel
sumber