Frage

Ich bin vor, was ich denke, ein einfaches Problem mit Hibernate ist, aber es nicht lösen kann (Hibernate Foren sicherlich nicht helfen, nicht erreichbar ist).

Ich habe eine einfache Klasse möchte ich bestehen bleiben, aber halten immer:

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 entsprechende Code für die persistente Klasse ist:

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 Lauf Code ist einfach nur:

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 versucht, einige „Strategien“ im GeneratedValue Anmerkung, aber es scheint einfach nicht zu funktionieren. id Initialisierung helfen entweder nicht! (ZB Long id = 20L).

Kann jemand etwas Licht?

EDIT 2: bestätigt: with@GeneratedValue(strategy = GenerationType.XXX) verwirren sie nicht lösen

GELÖST: Neuerstellung der Datenbank das Problem gelöst

War es hilfreich?

Lösung

Manchmal zum Modell vorgenommenen Änderungen oder die ORM reflektieren möglicherweise nicht genau auf der Datenbank auch nach einer Ausführung von SchemaUpdate.

Wenn der Fehler scheint tatsächlich eine vernünftige Erklärung fehlen, versuchen, die Datenbank neu zu erstellen (oder zumindest einen neuen erstellen) und Gerüste mit SchemaExport.

Andere Tipps

Wenn Sie wollen, dass MySQL automatisch Primärschlüssel zu erzeugen, dann haben Sie es zu sagen, wenn Sie die Tabelle erstellen. Sie haben nicht diese haben in Oracle zu tun.

Auf dem Primärschlüssel müssen Sie AUTO_INCREMENT umfassen. 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 Entity

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;
  }

}

Sie müssen das Update in Ihrer hbm2ddl Eigenschaft werden. machen Sie die Änderungen und aktualisieren Sie es so zu erstellen, dass sie in der Tabelle erstellen können.

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

Es funktioniert für mich.

Werfen Sie einen Blick auf GeneratedValue Strategie. Es sieht in der Regel so etwas wie:

@GeneratedValue(strategy=GenerationType.IDENTITY)

Ein weiterer Vorschlag ist, zu überprüfen, ob Sie einen gültigen Typen für das automatisch generierte Feld. Denken Sie daran, dass es nicht mit String funktioniert, aber es funktioniert mit Long:

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

@Constraints.Required
public String contents;

Die obige Syntax arbeitete für Tabellen in MySQL mit Hibernate als JPA 2.0-Provider zu erzeugen.

Ich hatte das gleiche Problem. Ich das Tutorial gefunden Hibernate One-To-One Mapping Beispiel Fremdschlüssel Annotation verwenden und es Schritt wie unter Schritt folgt:

Erstellen von Datenbanktabelle mit diesem Skript:

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 Einheiten 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;
}

wurde das Problem behoben.

Hinweis: Der Primärschlüssel muss AUTO_INCREMENT eingestellt werden

ich wegen der Fehlermeldung hierher kam, stellt sich heraus, ich hatte zwei Tabellen mit dem gleichen Namen.

Fügen Sie einfach nicht-NULL-Constraint

Ich hatte das gleiche Problem. Habe ich nur noch nicht-NULL-Constraint in XML-Mapping. Es funktioniert

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

Dropping die Tabelle aus der Datenbank manuell und dann wieder läuft die Anwendung für mich gearbeitet. In meinem Fall Tabelle wurde nicht ordnungsgemäß erstellt (mit Einschränkungen) denke ich.

Ich hatte dieses Problem. Mein Fehler war, hatte ich die einführbare und aktualisierbar fileds als falsch gesetzt und versuchte, das Feld in der Anfrage zu setzen. Dieses Feld wird als NON NULL in DB.

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

Später habe ich es zu - einführbar = true, aktualisierbare = true

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

Es funktioniert perfekt später.

Bitte überprüfen Sie, ob der Standardwert für die Spalte id insbesondere table.if nicht als Standard festzulegen

Ich hatte das gleiche Problem. Ich war mit einem Tisch sitzen und alles, was ich mit einer Reihe ID-Feld hatte und zwei Fremdschlüssel. Ich weiß nicht genau verursacht, aber ich habe die folgende

  1. Verbesserte MySQL Community 5.5.13
  2. Benennen Sie die Klasse und Tabelle
  3. Stellen Sie sicher, ich hatte hashcode und gleich Methoden

    @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;
    

Die gleiche Ausnahme ausgelöst wurde, wenn eine DB-Tabelle eine alte nicht entfernte Spalte hat.

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

Nach dem nicht verwendeten Attribute zu entfernen, in meinem Fall ContractID , wurde das Problem behoben.

Das ist mir passiert mit einem @ManyToMany Beziehung. Ich hatte eines der Felder in der Beziehung mit @JoinTable kommentierte, entfernte ich das und verwendet, um das mappedBy Attribut auf @ManyToMany statt.

Zusätzlich zu dem, was oben erwähnt, vergessen Sie nicht, , während Erstellen von SQL-Tabelle, die den AUTOINkREMENT , wie in diesem Beispiel zu machen

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
);

Ich habe versucht, den Code und in meinem Fall lösen Sie den Code unten das Problem. Ich hatte nicht das Schema richtig abgerechnet

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

Bitte versuchen Sie ,catalog="databasename" die gleiche hinzufügen, wie ich es tat.

,catalog="databasename"

In meinem Fall Ich änderte, dass säumige Tabellen und das Feld „id“ in Frage, die ich es AUTO_INCREMENT gemacht, muss ich noch herausfinden, warum auf sie Bereitstellungszeit nicht war es „AUTO_INCREMENT“ zu machen, so dass ich es selbst tun!

Was folgt aus:

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

Ich hoffe, es hilft Ihnen.

Vielleicht ist das Problem mit dem Tabellenschema. fällt die Tabelle und die Anwendung erneut aus.

Versuchen Long Objekttyp zu ändern primitiven Typ long (wenn Primitiven mit für Sie in Ordnung ist).

Ich hatte das gleiche Problem und wechselnden Typ hat mir geholfen.

Ich hatte dieses Problem, indem Fehler, den ich @Transient Anmerkung über diesem bestimmten Attribut gesetzt hatte. In meinem Fall dieser Fehler Sinn machen.

Fügen Sie eine Methode hashCode() auf Ihre Entity Bean-Klasse, und wiederholen Sie es

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top