Me enfrento a lo que creo que es un problema simple con Hibernate, pero no puedo resolverlo (los foros de Hibernate que son inalcanzables ciertamente no ayudan).
Tengo una clase simple que me gustaría persistir, pero sigo obteniendo:
SEVERE: Field 'id' doesn't have a default value
Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not insert: [hibtest.model.Mensagem]
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
[ a bunch more ]
Caused by: java.sql.SQLException: Field 'id' doesn't have a default value
[ a bunch more ]
El código relevante para la clase persistente es:
package hibtest.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Mensagem {
protected Long id;
protected Mensagem() { }
@Id
@GeneratedValue
public Long getId() {
return id;
}
public Mensagem setId(Long id) {
this.id = id;
return this;
}
}
Y el código de ejecución real es simple:
SessionFactory factory = new AnnotationConfiguration()
.configure()
.buildSessionFactory();
{
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
Mensagem msg = new Mensagem("YARR!");
session.save(msg);
tx.commit();
session.close();
}
Intenté algunas "estrategias" dentro de la GeneratedValue
anotación, pero parece que no funciona. ¡Inicializar id
tampoco ayuda! (por ejemplo Long id = 20L
)
¿Alguien podría arrojar algo de luz?
EDIT 2: confirmado: jugar con @GeneratedValue(strategy = GenerationType.XXX)
no lo resuelve
SOLUCIONADO: recrear la base de datos resolvió el problema
GenerationType
en @GeneratedValue
a partir IDENTITY
de AUTO
y funcionó para mí. Además, puede tener la propiedad de incremento automático establecida en MySQL.