generationtype - java hibernate sequence generator example
@GeneratedValue(strategy=GenerationType.AUTO) no funciona como el pensamiento (5)
Intento persistir un objeto en una base de datos. Sigue obteniendo ''Column ID no puede aceptar el error de valor nulo''. Mi objeto se ve así:
@Entity
public class TestTable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id = 0;
@Column(nullable=false, length=256)
private String data = "";
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
Mi función persistente:
public static synchronized boolean persistObject(Object obj){
boolean success = true;
EntityManager em = null;
EntityTransaction tx = null;
try{
em = getEmf().createEntityManager();
tx = em.getTransaction();
tx.begin();
em.persist(obj);
tx.commit();
} catch (Exception e){
success = false;
} finally{
try{
em.close();
} catch(Exception e){
//nothing
}
}
return success;
}
En mi caso, se trataba de mal dialecto:
hibernate.dialect=org.hibernate.dialect.H2Dialect
en lugar de:
hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect
cuando cambié a la base de datos de producción. Hibernate intentó utilizar la estrategia preparada para diferentes motores db.
Hibernate falla de manera silenciosa y misteriosa cuando la columna ID es un Int. Intente cambiarlo por Long en el código y un entero de 64 bits sin signo en la base de datos. Eso solucionó el problema para mí.
O intente con @GeneratedValue(strategy = GenerationType.AUTO)
lugar de @GeneratedValue(strategy = GenerationType.SEQUENCE)
.
Puede usar GenerationType.TABLE. De esta forma, jpa usa una tabla de secuencia para la asignación de id. Y es posible que nunca necesite generar valores de secuencia o autoincrementar o desencadenantes que reduzcan la portabilidad.
También tenga en cuenta que en java int se inicia con 0 predeterminado, por lo que puede deshacerse de eso también.
Tuve un problema con una manifestación similar a la tuya. Eventualmente descubrí que la configuración de mi conexión a la base de datos era incorrecta: me estaba conectando a una base de datos anterior que tenía un esquema incorrecto. El nuevo esquema declaró la columna de clave primaria como
"ID" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)
por lo que la base de datos generó automáticamente la clave primaria mientras que el esquema anterior lo declaró como
"ID" INTEGER NOT NULL
Hibernate ejecutó el código correcto para el nuevo esquema, que falló en el esquema anterior porque el esquema anterior exigía que SQL INSERT
proporcionara un valor para la columna de ID
.