Hibernate Auto Increment ID


86

Ho un'applicazione j2ee che utilizza l'ibernazione con annotazione. Come annoto il campo Id nella mia classe pojo per impostarlo come incremento automatico o generato automaticamente. e aggiungendo il fagiolo lascio quel campo nel mio fagiolo nullo?

Risposte:


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

e lo lasci null( 0) quando persisti. ( nullse usi i wrapper Integer/ Long)

In alcuni casi la AUTOstrategia viene risolta in SEQUENCErathen than to IDENTITYor TABLE, quindi potresti volerla impostare manualmente su IDENTITYo TABLE(a seconda del database sottostante).

Sembra SEQUENCE+ che specificare il nome della sequenza abbia funzionato per te.


il mio id è di tipo stringa. cosa gli imposterò. Perché ottengo questo errore. Causato da: javax.el.ELException: org.hibernate.exception.SQLGrammarException: impossibile ottenere il valore della sequenza successiva
cedric

4
autoincrement significa che è un numero che viene incrementato. Una stringa non può essere incrementata. Crea la colonna int
Bozho

La colonna myid nel database è di tipo numero. E ho già cambiato il mio ID nel mio pojo in int. ottengo la sequenza di errore non esiste
cedric

2
Per Oracle, SEQUENCE è la cosa più vicina all'autoincremento. Devi creare la sequenza in anticipo a meno che tu non lasci che Hibernate generi il tuo schema. Se pensi di poter supportare più database ad un certo punto, usa TABLE.
Brian Deterling

2
Non utilizzare l'identità, Oracle non supporta l'identità, supporta la sequenza.
JuanZe

33

Fallo come segue: -

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

Puoi usare qualsiasi nome arbitrario invece di kaugen. Ha funzionato bene, ho potuto vedere di seguito le query su console

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

Questo funziona per me. Ma non mi consente di impostare il valore ID. Ho provato a setID con numeri interi o int, ma utilizza max in qualsiasi momento. Cosa dovrei fare?
desudesudesu

usa @GenericGenerator (name = "incrementId", strategy = "assign") @GeneratedValue (generator = "incrementId"). Ti permetterà di impostare l'ID da solo. Ma se non lo passi, allora sarà 0.
Ravi Kant

@Kaushik Lele La strategia = "incremento" ibernare la strategia di incremento incorporata? Rientra in quale di queste SEQUENZA, IDENTITÀ, AUTO, TABELLA?
sentirsi bene e programmare

Che ne dici di 700 milioni di record nella tabella? Questo potrebbe essere il problema senza indice credo
user2171669

10

Cordiali saluti

Utilizzando netbeans New Entity Classes dal database con una colonna mysql * auto_increment *, crea un attributo con le seguenti annotazioni:

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

Questo mi stava ottenendo lo stesso un errore che diceva che la colonna non doveva essere nulla, quindi ho semplicemente rimosso l'anotazione @NotNull lasciando l'attributo null e funziona!


7

Hibernate definisce cinque tipi di strategie di generazione di identificatori:

AUTO : colonna identità, sequenza o tabella a seconda del database sottostante

TABELLA - tabella contenente l'id

IDENTITÀ - colonna identità

SEQUENZA - sequenza

copia identità : l'identità viene copiata da un'altra entità

Esempio utilizzando Table

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

per maggiori dettagli, controlla il link .


5

Se si dispone di una colonna numerica che si desidera incrementare automaticamente, potrebbe essere un'opzione da impostare columnDefinitiondirettamente. Questo ha il vantaggio che lo schema genera automaticamente il valore anche se viene utilizzato senza ibernazione. Tuttavia, questo potrebbe rendere il tuo codice specifico per db:

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

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

1

Nel caso in cui qualcuno "sbalzi" in questa domanda SO alla ricerca di strategie per la tabella Informix quando PK è di tipo Seriale .

Ho scoperto che funziona ... come esempio.

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

Affinché funzioni assicurati che quando esegui session.SaveOrUpdate passi il valore per la colonna special_serial_pk NULL .

Nel mio caso faccio un POST HTML con JSON in questo modo ...

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

0

Utilizzando netbeans New Entity Classes dal database con una colonna auto_increment mysql , crea un attributo con il seguente hibernate.hbm.xml: id is auto increment

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.