Domanda

Sto affrontando quello che penso sia un semplice problema con Hibernate, ma non posso risolverlo (essendo i forum di Hibernate non raggiungibili certamente non aiuta).

Ho una classe semplice che vorrei perseverare, 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 codice rilevante 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 l'attuale codice in esecuzione è semplicemente:

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 di "quotazione" all'interno dell'annotazione GeneratedValue ma non sembra funzionare. L'inizializzazione di id non aiuta neanche! (ad es. Long id = 20L ).

Qualcuno potrebbe far luce?

EDIT 2: confermato: si scherza con @GeneratedValue (strategia = GenerationType.XXX) non lo risolve

RISOLTO: la ricostruzione del database ha risolto il problema

È stato utile?

Soluzione

A volte le modifiche apportate al modello o all'ORM potrebbero non riflettere in modo accurato sul database anche dopo l'esecuzione di SchemaUpdate .

Se in realtà l'errore sembra non avere una spiegazione ragionevole, prova a ricreare il database (o almeno a crearne uno nuovo) e impalcandolo con SchemaExport .

Altri suggerimenti

Se vuoi che MySQL produca automaticamente chiavi primarie, devi dirlo quando crei la tabella. Non devi farlo in Oracle.

Sulla chiave primaria devi includere AUTO_INCREMENT . Vedi l'esempio di seguito.

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;  

Ecco l'entità

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

}

devi usare update nella tua proprietà hbm2ddl. apporta le modifiche e aggiornalo in Crea in modo che possa creare la tabella.

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

Ha funzionato per me.

Dai un'occhiata alla strategia di GeneratedValue . In genere è simile a:

@GeneratedValue(strategy=GenerationType.IDENTITY)

Un altro suggerimento è verificare di utilizzare un tipo valido per il campo generato automaticamente. Ricorda che non funziona con String, ma funziona con Long:

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

@Constraints.Required
public String contents;

La sintassi di cui sopra ha funzionato per la generazione di tabelle in MySQL utilizzando Hibernate come provider JPA 2.0.

Ho avuto lo stesso problema. Ho trovato il tutorial Hibernate esempio di mapping uno a uno usando l'annotazione di chiave esterna e seguito passo dopo passo come di seguito:

Crea una tabella di database con questo script:

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

Ecco le entità con le tabelle sopra

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

Il problema è stato risolto.

Avviso: la chiave primaria deve essere impostata su AUTO_INCREMENT

Sono venuto qui a causa del messaggio di errore, risulta che avevo due tabelle con lo stesso nome.

Basta aggiungere un vincolo non nullo

Ho avuto lo stesso problema. Ho appena aggiunto un vincolo non nullo nella mappatura XML. Ha funzionato

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

Eliminare manualmente la tabella dal database e quindi rieseguire l'applicazione ha funzionato per me. Nel mio caso la tabella non è stata creata correttamente (con vincoli), credo.

Ho avuto questo problema. Il mio errore era che avevo impostato i file inseribili e aggiornabili come falsi e stavo cercando di impostare il campo nella richiesta. Questo campo è impostato come NON NULL nel DB.

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

Successivamente l'ho cambiato in - insertable = true, updatable = true

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

Ha funzionato perfettamente in seguito.

Verifica se il valore predefinito per l'id colonna in una particolare tabella.se non lo rende come predefinito

Ho avuto lo stesso problema. Stavo usando una tabella di join e tutto ciò che avevo con un campo ID riga e due chiavi esterne. Non conosco l'esatta causa ma ho fatto quanto segue

  1. Aggiornato MySQL alla community 5.5.13
  2. Rinomina la classe e la tabella
  3. Assicurati di avere hashcode e metodi uguali

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

La stessa eccezione veniva generata se una tabella DB aveva una vecchia colonna non rimossa.

Ad esempio: attributo_ID NON NULL BIGINT (20), e attributoId NOT NULL BIGINT (20),

Dopo aver rimosso l'attributo non utilizzato, nel mio caso contractId , il problema è stato risolto.

Questo mi è successo con una relazione @ManyToMany . Avevo annotato uno dei campi nella relazione con @JoinTable , l'ho rimosso e invece ho usato l'attributo mappedBy su @ManyToMany.

Oltre a quanto menzionato sopra, non dimenticare durante la creazione della tabella sql per rendere INCREMENTO AUTOMATICO come in questo esempio

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

Ho provato il codice e nel mio caso il codice seguente risolve il problema. Non avevo risolto correttamente lo schema

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

Prova ad aggiungere , catalog = " nome database " come ho fatto io.

,catalog="databasename"

Nel mio caso, Ho modificato le tabelle offensive e il campo "id" in questione l'ho creato AUTO_INCREMENT, devo ancora capire perché in tempi di implementazione non lo stava facendo " AUTO_INCREMENT " così che devo farlo da solo!

Che dire di questo:

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

Spero che ti aiuti.

Forse questo è il problema con lo schema della tabella. rilascia la tabella ed esegui nuovamente l'applicazione.

Prova a cambiare il tipo di oggetto Long in long (se usare le primitive è giusto per te).

Ho avuto lo stesso problema e il cambio di tipo mi ha aiutato.

Ho riscontrato questo problema, per errore avevo inserito l'annotazione @Transient sopra quel particolare attributo. Nel mio caso questo errore ha senso.

Aggiungi un metodo hashCode () alla tua classe Bean di entità e riprova

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top