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:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
e lo lasci null
( 0
) quando persisti. ( null
se usi i wrapper Integer
/ Long
)
In alcuni casi la AUTO
strategia viene risolta in SEQUENCE
rathen than to IDENTITY
or TABLE
, quindi potresti volerla impostare manualmente su IDENTITY
o TABLE
(a seconda del database sottostante).
Sembra SEQUENCE
+ che specificare il nome della sequenza abbia funzionato per te.
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 (?, ?, ?, ?, ?)
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!
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 .
Se si dispone di una colonna numerica che si desidera incrementare automaticamente, potrebbe essere un'opzione da impostare columnDefinition
direttamente. 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
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
}
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