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:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
y lo dejas null
( 0
) al persistir. ( null
si usa Integer
/ Long
envoltorios)
En algunos casos, la AUTO
estrategia se resuelve en SEQUENCE
rathen que en IDENTITY
o TABLE
, por lo que es posible que desee configurarla manualmente en IDENTITY
o TABLE
(según la base de datos subyacente).
Parece SEQUENCE
+ especificar el nombre de la secuencia funcionó para usted.
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 (?, ?, ?, ?, ?)
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!
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 .
Si tiene una columna numérica que desea incrementar automáticamente, podría ser una opción para configurarla columnDefinition
directamente. 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
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
}
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