it-swarm.com.de

Ruhezustand: "Feld 'id' hat keinen Standardwert"

Ich stehe vor dem, was ich denke, ist ein einfaches 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 beharren möchte, aber immer wieder:

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 eigentliche Laufcode 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 ein paar "Strategien" in der GeneratedValue-Anmerkung ausprobiert, aber es scheint einfach nicht zu funktionieren. Das Initialisieren von id hilft auch nicht! (zB Long id = 20L).

Könnte jemand etwas Licht werfen?

EDIT 2: bestätigt: Durcheinander mit@GeneratedValue(strategy = GenerationType.XXX) löst es nichts

Gelöst: Wiederherstellen der Datenbank löste das Problem

98
André Chalella

Manchmal werden Änderungen, die am Modell oder am ORM vorgenommen wurden, auch nach einer Ausführung von SchemaUpdate möglicherweise nicht korrekt in der Datenbank angezeigt.

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 SchemaExport zu versehen.

89
André Chalella

Wenn Sie möchten, dass MySQL automatisch Primärschlüssel erzeugt, müssen Sie dies beim Erstellen der Tabelle angeben. Sie müssen dies nicht in Oracle tun.

Auf dem Primärschlüssel müssen Sie AUTO_INCREMENT angeben. Siehe das Beispiel unten.

CREATE TABLE `supplier`  
(  
  `ID` int(11) NOT NULL **AUTO_INCREMENT**,  
  `FIRSTNAME` varchar(60) NOT NULL,  
  `SECONDNAME` varchar(100) NOT NULL,  
  `PROPERTYNUM` varchar(50) DEFAULT NULL,  
  `STREETNAME` varchar(50) DEFAULT NULL,  
  `CITY` varchar(50) DEFAULT NULL,  
  `COUNTY` varchar(50) DEFAULT NULL,  
  `COUNTRY` varchar(50) DEFAULT NULL,  
  `POSTCODE` varchar(50) DEFAULT NULL,  
  `HomePHONENUM` bigint(20) DEFAULT NULL,  
  `WorkPHONENUM` bigint(20) DEFAULT NULL,  
  `MobilePHONENUM` bigint(20) DEFAULT NULL,  
  `EMAIL` varchar(100) DEFAULT NULL,  
  PRIMARY KEY (`ID`)  
) 

ENGINE=InnoDB DEFAULT CHARSET=latin1;  

Hier ist die Entität

package com.keyes.jpa;  

import Java.io.Serializable;
import javax.persistence.*;
import Java.math.BigInteger;

/**
 * The persistent class for the parkingsupplier database table.
 * 
 */
@Entity
@Table(name = "supplier")
public class supplier implements Serializable
{
  private static final long serialVersionUID = 1L;

  @Id
  **@GeneratedValue(strategy = GenerationType.IDENTITY)**
  @Column(name = "ID")
  private long id;

  @Column(name = "CITY")
  private String city;

  @Column(name = "COUNTRY")
  private String country;

  @Column(name = "COUNTY")
  private String county;

  @Column(name = "EMAIL")
  private String email;

  @Column(name = "FIRSTNAME")
  private String firstname;

  @Column(name = "HomePHONENUM")
  private BigInteger homePHONENUM;

  @Column(name = "MobilePHONENUM")
  private BigInteger mobilePHONENUM;

  @Column(name = "POSTCODE")
  private String postcode;

  @Column(name = "PROPERTYNUM")
  private String propertynum;

  @Column(name = "SECONDNAME")
  private String secondname;

  @Column(name = "STREETNAME")
  private String streetname;

  @Column(name = "WorkPHONENUM")
  private BigInteger workPHONENUM;

  public supplier()
  {
  }

  public long getId()
  {
    return this.id;
  }

  public void setId(long id)
  {
    this.id = id;
  }

  public String getCity()
  {
    return this.city;
  }

  public void setCity(String city)
  {
    this.city = city;
  }

  public String getCountry()
  {
    return this.country;
  }

  public void setCountry(String country)
  {
    this.country = country;
  }

  public String getCounty()
  {
    return this.county;
  }

  public void setCounty(String county)
  {
    this.county = county;
  }

  public String getEmail()
  {
    return this.email;
  }

  public void setEmail(String email)
  {
    this.email = email;
  }

  public String getFirstname()
  {
    return this.firstname;
  }

  public void setFirstname(String firstname)
  {
    this.firstname = firstname;
  }

  public BigInteger getHomePHONENUM()
  {
    return this.homePHONENUM;
  }

  public void setHomePHONENUM(BigInteger homePHONENUM)
  {
    this.homePHONENUM = homePHONENUM;
  }

  public BigInteger getMobilePHONENUM()
  {
    return this.mobilePHONENUM;
  }

  public void setMobilePHONENUM(BigInteger mobilePHONENUM)
  {
    this.mobilePHONENUM = mobilePHONENUM;
  }

  public String getPostcode()
  {
    return this.postcode;
  }

  public void setPostcode(String postcode)
  {
    this.postcode = postcode;
  }

  public String getPropertynum()
  {
    return this.propertynum;
  }

  public void setPropertynum(String propertynum)
  {
    this.propertynum = propertynum;
  }

  public String getSecondname()
  {
    return this.secondname;
  }

  public void setSecondname(String secondname)
  {
    this.secondname = secondname;
  }

  public String getStreetname()
  {
    return this.streetname;
  }

  public void setStreetname(String streetname)
  {
    this.streetname = streetname;
  }

  public BigInteger getWorkPHONENUM()
  {
    return this.workPHONENUM;
  }

  public void setWorkPHONENUM(BigInteger workPHONENUM)
  {
    this.workPHONENUM = workPHONENUM;
  }

}
50
Greg Keyes

Sehen Sie sich die Strategie von GeneratedValue an. Es sieht normalerweise so aus:

@GeneratedValue(strategy=GenerationType.IDENTITY)
9
Steve Kuo

sie müssen update in Ihrer hbm2ddl -Eigenschaft verwenden. Nehmen Sie die Änderungen vor und aktualisieren Sie sie in Create, damit die Tabelle erstellt werden kann.

<property name="hbm2ddl.auto">create</property>

Es hat für mich funktioniert.

8
anzie001

Ein anderer Vorschlag besteht darin, zu prüfen, ob Sie einen gültigen Typ für das automatisch generierte Feld verwenden. Denken Sie daran, dass es nicht mit String funktioniert, aber mit Long:

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long id;

@Constraints.Required
public String contents;

Die obige Syntax funktionierte zum Generieren von Tabellen in MySQL unter Verwendung von Hibernate als JPA 2.0-Anbieter.

3
nize

Ich hatte das gleiche Problem. Ich habe das Tutorial Hibernate One-To-One-Mapping-Beispiel mit Hilfe der Fremdschlüssel-Annotation gefunden und es schrittweise wie folgt verfolgt:

Erstellen Sie mit diesem Skript eine Datenbanktabelle:

create table ADDRESS (
   id INT(11) NOT NULL AUTO_INCREMENT,
   street VARCHAR(250) NOT NULL,
   city  VARCHAR(100) NOT NULL,
   country  VARCHAR(100) NOT NULL,
   PRIMARY KEY (id)
);

create table STUDENT (
    id            INT(11) NOT NULL AUTO_INCREMENT, 
    name          VARCHAR(100) NOT NULL, 
    entering_date DATE NOT NULL, 
    nationality   TEXT NOT NULL, 
    code          VARCHAR(30) NOT NULL,
    address_id INT(11) NOT NULL,
    PRIMARY KEY (id),
    CONSTRAINT student_address FOREIGN KEY (address_id) REFERENCES ADDRESS (id)   
);

Hier sind die Entitäten mit den obigen Tabellen

@Entity
@Table(name = "STUDENT")
public class Student implements Serializable {

    private static final long serialVersionUID = 6832006422622219737L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

 }

@Entity
@Table(name = "ADDRESS")
public class Address {

    @Id @GeneratedValue
    @Column(name = "ID")
    private long id;
}

Das Problem wurde gelöst. 

Hinweis: Der Primärschlüssel muss auf AUTO_INCREMENT gesetzt sein

3
David Pham

Einfach Nicht-Null-Einschränkung hinzufügen  

Ich hatte das gleiche Problem. Ich habe gerade die Nicht-Null-Einschränkung in der XML-Zuordnung hinzugefügt. Es funktionierte

<set name="phone" cascade="all" lazy="false" > 
   <key column="id" not-null="true" />
   <one-to-many class="com.practice.phone"/>
</set>
2
user2982704

Das manuelle Ablegen der Tabelle aus der Datenbank und das erneute Ausführen der Anwendung funktionierte für mich. In meinem Fall wurde die Tabelle nicht richtig erstellt (mit Einschränkungen), denke ich. 

2
Sen

Ich bin wegen der Fehlermeldung hierher gekommen, stellte sich heraus, dass ich zwei Tabellen mit demselben Namen hatte.

2

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 ist in DB auf NON NULL gesetzt.

@ManyToOne
@JoinColumn(name="roles_id",  referencedColumnName = "id", insertable = false, updatable = false, nullable=false)
@JsonBackReference
private Role role;

Später änderte ich es zu - insertable = true, updatable = true

@ManyToOne
@JoinColumn(name="roles_id",  referencedColumnName = "id", insertable = true, updatable = true, nullable=false)
@JsonBackReference
//@JsonIgnore
private Role role;

Es hat später perfekt funktioniert.

1
Kavitha yadav

Zusätzlich zu den oben genannten Zwecken ist nicht vergessen beim Erstellen der SQL-Tabelle erforderlich, um AUTO INCREMENT wie in diesem Beispiel zu erstellen

CREATE TABLE MY_SQL_TABLE (

  USER_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
  FNAME VARCHAR(50) NOT NULL,
  LNAME VARCHAR(20) NOT NULL,
  EMAIL VARCHAR(50) NOT NULL
);
0
Ahmad Merghany

Ich habe den Code ausprobiert und in meinem Fall löst der Code das Problem. Ich hatte das Schema nicht richtig geregelt 

@Entity
    @Table(name="table"
         ,catalog="databasename"
      )

Bitte versuchen Sie, ,catalog="databasename" genauso hinzuzufügen wie ich. 

,catalog="databasename"
0
Justo Miguel

Bitte überprüfen Sie, ob der Standardwert für die Spalten-ID in bestimmten table.if nicht als Standard festgelegt ist

0
Arun

"Feld 'id' hat keinen Standardwert", weil Sie GenerationType.IDENTITY in GeneratedValue Annotation nicht deklariert haben.

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
0
Dracula Oppa

Was ist mit diesem:

<set name="fieldName" cascade="all"> 
   <key column="id" not-null="true" />
   <one-to-many class="com.yourClass"/>
</set>

Ich hoffe es hilft dir.

0
David Davila

Vielleicht liegt das Problem beim Tabellenschema. die Tabelle fallen lassen und die Anwendung erneut ausführen.

0
SHIVA

Ich hatte dieses Problem, versehentlich habe ich @Transient-Anmerkung über diesem bestimmten Attribut. In meinem Fall macht dieser Fehler Sinn.

0
user158

Ich hatte das gleiche Problem. Ich verwendete eine Join-Tabelle und alles, was ich hatte, mit einem Zeilen-ID-Feld und zwei Fremdschlüsseln. Ich weiß nicht genau, was verursacht wurde, aber ich habe Folgendes getan

  1. MySQL auf Community 5.5.13 aktualisiert
  2. Benennen Sie die Klasse und die Tabelle um
  3. Stellen Sie sicher, dass ich Hashcode und gleich Methoden hatte

    @Entity 
    @Table(name = "USERGROUP")
    public class UserGroupBean implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "USERGROUP_ID")
    private Long usergroup_id;
    
    @Column(name = "USER_ID")   
    private Long user_id;
    
    @Column(name = "GROUP_ID")
    private Long group_id;
    
0
Eric

Ändern Sie den Long-Objekttyp in den long-Primitivtyp (wenn die Verwendung von Primitiven für Sie in Ordnung ist). 

Ich hatte das gleiche Problem und der Typwechsel half mir. 

0
Olga

In meinem Fall Ich habe die beanstandeten Tabellen und das Feld "id" geändert, um das ich es gemacht habe AUTO_INCREMENT. Ich muss immer noch herausfinden, warum es bei der Bereitstellung nicht "AUTO_INCREMENT" war, sodass ich es tun muss alleine!

Dieselbe Ausnahme wurde ausgelöst, wenn eine DB-Tabelle eine alte, nicht entfernte Spalte hatte.

Zum Beispiel: attribute_id NOT NULL BIGINT(20), und attributeId NOT NULL BIGINT(20),

Nach dem Entfernen des nicht verwendeten Attributs wurde in meinem Fall contractId das Problem behoben. 

0
Viktor Reinok

Dies ist mir mit einer @ManyToMany-Beziehung passiert. Ich hatte eines der Felder in der Beziehung mit @JoinTable kommentiert, entfernte es und verwendete stattdessen das Attribut mappedBy für @ManyToMany.

0
gary69