2010-01-06 36 views
63

Tengo una aplicación j2ee que utiliza hibernación con anotación. ¿Cómo anoto el campo Id en mi clase pojo para configurarlo como auto incremento o auto generado? y al agregar el frijol dejo ese campo en mi bean null?Hibernate Auto Increment ID

Respuesta

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

y lo deja null (0) cuando persiste. (null si utiliza los Integer/Long envolturas)

En algunos casos la estrategia AUTO se resuelve a SEQUENCE Rathen que a IDENTITY o TABLE, por lo que es posible que desee configurar manualmente a IDENTITY o TABLE (dependiendo de la base de datos subyacente)

Parece SEQUENCE + que especifica el nombre de la secuencia trabajado para usted.

+0

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

+3

autoincrement significa que es un número que se incrementa. Una cadena no puede ser incrementada. Haga que la columna int – Bozho

+0

myid column en la base de datos sea de tipo número. Y ya cambié mi identificación en mi pojo a int. me sale la secuencia de error no existe – cedric

4

Si tiene una columna numérica que desea autoincrementar, podría ser una opción establecer columnDefinition directamente. Esto tiene la ventaja de que el esquema genera automáticamente el valor incluso si se utiliza sin hibernación. Esto puede hacer que el código db-específica embargo:

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

Hágalo de la siguiente manera: -

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

Se puede utilizar cualquier nombre arbitrario en lugar de kaugen. funcionó bien, pude ver a continuación consultas en la consola

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

Este funciona para mí. Pero no me deja establecer el valor de ID. Intenté establecer ID con enteros o int, pero usa max en cualquier momento. ¿Que debería hacer? – desudesudesu

+0

use @GenericGenerator (name = "incrementId", strategy = "assigned") @GeneratedValue (generator = "incrementId"). Le permitirá establecer su ID por su cuenta. Pero si no pasa el ID, entonces será 0 –

+0

@Kaushik Lele ¿Es estrategia = "incrementar" hibernar incrementos incorporados? ¿Depende de cuál de estas SECUENCIAS, IDENTIDAD, AUTO, TABLA? –

6

FYI

Usando netbeansClases nueva entidad de base de datos con un MySQL * AUTO_INCREMENT * columna, se 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 poniendo igual n error al decir que la columna no debe ser nula, así que simplemente eliminé la anotación @NotNull dejando el atributo nulo, ¡y funciona!

6

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

AUTO - ya sea columna de identidad, secuencia o tabla en función de la DB subyacente

TABLA - mesa que sostiene el id

IDENTIDAD - columna de identidad

SECUENCIA - secuencia

copia identidad - la identidad se copia desde otra entidad

Ejemplo usando la 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, consultar la link.

+1

Lo sentimos, el enlace está fuera de fecha ... –

Cuestiones relacionadas