Ich stehe vor einem meiner Meinung nach einfachen Problem mit Hibernate, kann es aber nicht lösen (Hibernate-Foren, die nicht erreichbar sind, helfen sicherlich nicht).
Ich habe eine einfache Klasse, die ich gerne fortsetzen würde, aber immer wieder bekomme:
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 ]
Der relevante Code für die persistierte Klasse lautet:
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;
}
}
Und der tatsächliche laufende Code ist einfach:
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();
}
Ich habe einige "Strategien" innerhalb der GeneratedValue
Anmerkung ausprobiert, aber es scheint einfach nicht zu funktionieren. Initialisierung id
hilft auch nicht! (zB Long id = 20L
).
Könnte jemand etwas Licht ins Dunkel bringen?
EDIT 2: bestätigt: Durchspielen mit @GeneratedValue(strategy = GenerationType.XXX)
löst es nicht
Gelöst: Die Neuerstellung der Datenbank hat das Problem gelöst
java
hibernate
jpa
persistence
André Chalella
quelle
quelle
GenerationType
in@GeneratedValue
vonIDENTITY
zuAUTO
und es funktionierte für mich. Sie können auch die Eigenschaft für die automatische Inkrementierung in MySQL festlegen.Antworten:
Manchmal werden Änderungen am Modell oder am ORM auch nach einer Ausführung von nicht genau in der Datenbank wiedergegeben
SchemaUpdate
.Wenn der Fehler tatsächlich keine vernünftige Erklärung zu haben scheint, versuchen Sie, die Datenbank neu zu erstellen (oder zumindest eine neue zu erstellen) und sie mit einem Gerüst zu versehen
SchemaExport
.quelle
SET foreign_key_checks = 0;
ist Ihr Freund. Seien Sie einfach sicher,SET foreign_key_checks = 1;
wenn Sie fertig sind.Wenn MySQL automatisch Primärschlüssel erstellen soll, müssen Sie dies beim Erstellen der Tabelle angeben. Sie müssen dies in Oracle nicht tun.
Auf dem Primärschlüssel müssen Sie angeben
AUTO_INCREMENT
. Siehe das folgende Beispiel.Hier ist die Entität
quelle
Sie müssen update in Ihrer hbm2ddl-Eigenschaft verwenden. Nehmen Sie die Änderungen vor und aktualisieren Sie sie auf Erstellen, damit die Tabelle erstellt werden kann.
Es hat bei mir funktioniert.
quelle
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id;
Und mit dem Wertcreate
in derhbm2ddl.auto
Eigenschaft werden die Änderungen in meinem Datenbankschema übernommen. Vielen Dank ....Schauen Sie sich
GeneratedValue
die Strategie an. Es sieht normalerweise so aus:quelle
Das manuelle Löschen der Tabelle aus der Datenbank und das erneute Ausführen der Anwendung hat bei mir funktioniert. In meinem Fall wurde die Tabelle vermutlich nicht richtig erstellt (mit Einschränkungen).
quelle
Ich hatte dieses Problem. Mein Fehler war, dass ich die einfügbaren und aktualisierbaren Dateien als falsch festgelegt hatte und versuchte, das Feld in der Anforderung festzulegen. Dieses Feld wird in der Datenbank als NON NULL festgelegt.
Später habe ich es geändert in - insertable = true, updatable = true
Es hat später perfekt funktioniert.
quelle
Ich bin wegen der Fehlermeldung hierher gekommen. Es stellte sich heraus, dass ich zwei Tabellen mit demselben Namen hatte.
quelle
Ein weiterer Vorschlag besteht darin, zu überprüfen, ob Sie einen gültigen Typ für das automatisch generierte Feld verwenden. Denken Sie daran, dass es nicht mit String funktioniert, sondern mit Long:
Die obige Syntax diente zum Generieren von Tabellen in MySQL unter Verwendung von Hibernate als JPA 2.0-Anbieter.
quelle
Ich hatte das gleiche Problem. Ich fand das Tutorial Beispiel für die Eins-zu-Eins-Zuordnung im Ruhezustand mithilfe der Fremdschlüsselanmerkung und folgte ihm Schritt für Schritt wie folgt:
Erstellen Sie eine Datenbanktabelle mit diesem Skript:
Hier sind die Entitäten mit den obigen Tabellen
Das Problem wurde behoben.
Hinweis: Der Primärschlüssel muss auf AUTO_INCREMENT gesetzt sein
quelle
Fügen Sie einfach eine Nicht-Null-Einschränkung hinzu
Ich hatte das gleiche Problem. Ich habe gerade eine Nicht-Null-Einschränkung in der XML-Zuordnung hinzugefügt. Es funktionierte
quelle
Vielleicht ist das das Problem mit dem Tabellenschema. Löschen Sie die Tabelle und führen Sie die Anwendung erneut aus.
quelle
Vergessen Sie nicht, zusätzlich zu den oben genannten Punkten beim Erstellen einer SQL-Tabelle das AUTO INCREMENT wie in diesem Beispiel zu erstellen
quelle
Bitte überprüfen Sie, ob der Standardwert für die Spalten-ID in einer bestimmten Tabelle nicht standardmäßig festgelegt ist
quelle
Ich hatte das gleiche Problem. Ich benutzte eine Join-Tabelle und alles, was ich hatte, mit einem Zeilen-ID-Feld und zwei Fremdschlüsseln. Ich kenne die genaue Ursache nicht, aber ich habe Folgendes getan
Stellen Sie sicher, dass ich Hashcode hatte und Methoden gleich
quelle
Die gleiche Ausnahme wurde ausgelöst, wenn eine DB-Tabelle eine alte nicht entfernte Spalte hatte.
Zum Beispiel:
attribute_id NOT NULL BIGINT(20),
undattributeId NOT NULL BIGINT(20),
Nach dem Entfernen des nicht verwendeten Attributs, in meinem Fall contractId , wurde das Problem behoben.
quelle
Das ist mir mit einer
@ManyToMany
Beziehung passiert . Ich hatte eines der Felder in der Beziehung mit kommentiert@JoinTable
, das entfernt undmappedBy
stattdessen das Attribut für @ManyToMany verwendet.quelle
Ich habe den Code ausprobiert und in meinem Fall löst der folgende Code das Problem. Ich hatte das Schema nicht richtig festgelegt
Bitte versuchen Sie
,catalog="databasename"
das gleiche wie ich hinzuzufügen .quelle
In meinem Fall habe ich diese fehlerhaften Tabellen und das fragliche Feld "id" geändert. Ich habe es zu AUTO_INCREMENT gemacht. Ich muss immer noch herausfinden, warum es bei der Bereitstellung nicht zu "AUTO_INCREMENT" gemacht wurde, damit ich es selbst tun muss!
quelle
Was ist damit:
Ich hoffe es hilft dir.
quelle
Versuchen Sie, den
Long
Objekttyp in einenlong
primitiven Typ zu ändern (wenn die Verwendung von Primitiven für Sie in Ordnung ist).Ich hatte das gleiche Problem und der Typwechsel half mir.
quelle
Ich hatte dieses Problem, ich hatte versehentlich eine
@Transient
Anmerkung über diesem bestimmten Attribut platziert. In meinem Fall ist dieser Fehler sinnvoll.quelle
"Feld 'id' hat keinen Standardwert", weil Sie
GenerationType.IDENTITY
inGeneratedValue
Annotation nicht deklariert haben .quelle
Dieses Problem liegt daran, dass Sie manchmal die Datenbank erneut aktualisieren / erstellen müssen oder manchmal, wenn Sie das Feld in der DB-Tabelle hinzugefügt haben, aber keine Entitätsklasse, keinen Nullwert oder Null einfügen können, sodass dieser Fehler auftrat. Überprüfen Sie also beide side.Db- und Entity-Klassen.
quelle
Wenn Ihr Feld nicht nullwertfähig ist, muss bei der Tabellenerstellung ein Standardwert angegeben werden. Erstellen Sie eine Tabelle mit ordnungsgemäß initialisiertem AUTO_INCREMENT neu, damit die DB keinen Standardwert benötigt, da sie ihn selbst generiert und dort niemals NULL setzt.
);
https://www.w3schools.com/sql/sql_autoincrement.asp
quelle
Ich habe einen solchen Fehler in GCP Cloud SQL, wenn das Modellfeld nicht mit dem richtigen Tabellenfeld in DB übereinstimmt. Beispiel: Wenn im Modellfeld eine
fieldName
Tabelle in der Datenbank vorhanden ist, sollte mir das Feld Feldname für die
field_name
Fixierungstabelle geholfen haben.quelle
Fügen Sie
hashCode()
Ihrer Entity Bean-Klasse eine Methode hinzu und wiederholen Sie siequelle