ID de incremento automático de hibernación

86

Tengo una aplicación j2ee que usa hibernación con anotación. ¿Cómo anoto el campo Id en mi clase pojo para configurarlo como incremento automático o generado automáticamente? y al agregar el bean, ¿dejo ese campo en mi bean nulo?

cedric
fuente

Respuestas:

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

y lo dejas null( 0) al persistir. ( nullsi usa Integer/ Longenvoltorios)

En algunos casos, la AUTOestrategia se resuelve en SEQUENCErathen que en IDENTITYo TABLE, por lo que es posible que desee configurarla manualmente en IDENTITYo TABLE(según la base de datos subyacente).

Parece SEQUENCE+ especificar el nombre de la secuencia funcionó para usted.

Bozho
fuente
mi identificación es de tipo cadena. ¿Qué le pondré? Porque recibo este error. Causado por: javax.el.ELException: org.hibernate.exception.SQLGrammarException: no se pudo obtener el siguiente valor de secuencia
cedric
4
autoincrement significa que es un número que se incrementa. No se puede incrementar una cadena. Hacer que la columna sea int
Bozho
La columna myid en la base de datos es de tipo número. Y ya cambié mi identificación en mi pojo a int. obtengo la secuencia de error no existe
cedric
2
Para Oracle, SEQUENCE es lo más parecido al autoincremento. Debe crear la secuencia con anticipación a menos que permita que Hibernate genere su esquema. Si cree que podría admitir varias bases de datos en algún momento, use TABLE.
Brian Deterling
2
No use la identidad, Oracle no admite la identidad, admite la secuencia.
JuanZe
33

Hágalo de la siguiente manera:

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

Puede utilizar cualquier nombre arbitrario en lugar de kaugen. Funcionó bien, pude ver las consultas a continuación en la consola

Hibernate: select max(proj_id) from javaproj
Hibernate: insert into javaproj (AUTH_email, AUTH_firstName, AUTH_lastName, projname,         proj_id) values (?, ?, ?, ?, ?)
Kaushik Lele
fuente
Esta funciona para mí. Pero no me deja establecer el valor de ID. Intenté setID con enteros o int, pero usa max en cualquier momento. ¿Qué tengo que hacer?
desudesudesu
use @GenericGenerator (nombre = "incrementId", estrategia = "asignado") @GeneratedValue (generator = "incrementId"). Le permitirá establecer la identificación por su cuenta. Pero si no pasa la identificación, entonces será 0.
Ravi Kant
@Kaushik Lele ¿La estrategia = "incremento" hibernación es una estrategia de incremento incorporada? ¿Se incluye en cuál de estos SEQUENCE, IDENTITY, AUTO, TABLE?
siéntete bien y programando
¿Qué tal 700 millones de registros en la tabla? Este podría ser el problema sin índice, creo
user2171669
10

FYI

El uso de Netbeans New Entity Classes de Database con una columna mysql * auto_increment *, crea un atributo con las siguientes anotaciones:

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

Esto me estaba dando el mismo error que decía que la columna no debe ser nula, así que simplemente eliminé la anotación @NotNull dejando el atributo nulo, ¡y funciona!

jmoreira
fuente
7

Hibernate define cinco tipos de estrategias de generación de identificadores:

AUTO : columna de identidad, secuencia o tabla, según la base de datos subyacente

TABLE - tabla que contiene la identificación

IDENTIDAD - columna de identidad

SECUENCIA - secuencia

copia de identidad : la identidad se copia de otra entidad

Ejemplo usando tabla

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

para más detalles, consulte el enlace .

usuario2530633
fuente
4

Si tiene una columna numérica que desea incrementar automáticamente, podría ser una opción para configurarla columnDefinitiondirectamente. Esto tiene la ventaja de que el esquema genera automáticamente el valor incluso si se usa sin hibernación. Sin embargo, esto podría hacer que su código sea específico de la base de datos:

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

En caso de que alguien "tropiece" en esta pregunta SO en la búsqueda de estrategias para la tabla Informix cuando PK es de tipo Serial .

He descubierto que esto funciona ... como ejemplo.

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

Para que esto funcione, asegúrese de que cuando haga session.SaveOrUpdate pase el valor de la columna special_serial_pk NULL .

En mi caso, hago un POST HTML con JSON así ...

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

El uso de netbeans New Entity Classes de la base de datos con una columna mysql auto_increment , crea un atributo con el siguiente hibernate.hbm.xml: id es auto incremento

Ankur Patel
fuente