Sono di fronte a quello che penso sia un problema semplice con Hibernate, ma non è in grado di risolverlo (i forum di Hibernate sono irraggiungibili certamente non aiutano).Hibernate: "Field 'id' non ha un valore predefinito"
ho una semplice classe che vorrei a persistere, ma continuo a ricevere:
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 ]
Il relativo codice per la classe persistente è:
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;
}
}
E il codice in esecuzione reale è solo pianura:
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();
}
ho provato alcune "strategie" all'interno del GeneratedValue
di annotazione, ma semplicemente non sembra funzionare. L'inizializzazione id
non aiuta neanche! (ad es. Long id = 20L
).
Qualcuno potrebbe far luce?
EDIT 2: confermato: scherzi con @GeneratedValue(strategy = GenerationType.XXX)
non lo risolve
RISOLTO: ricreare il database ha risolto il problema
Qual è l'origine del Costruttore che utilizza String? –
Mi dispiace, ho omesso questo. Inizializza semplicemente un campo String con il valore passato. –
Stai utilizzando le classi di entità JPA e le chiamate di sessione di Ibernazione, puoi mescolare queste due? –