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?

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.


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 (?, ?, ?, ?, ?)

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!


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 .


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

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
}

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.