Pregunta

Me estoy enfrentando a lo que creo que es un problema simple con Hibernate, pero no puedo resolverlo (los foros de Hibernate no son accesibles).

Tengo una clase simple en la que me gustaría persistir, pero sigo recibiendo:

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 ]

El código relevante para la clase persistente es:

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

Y el código de ejecución real es simple:

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

Probé algunas " estrategias " dentro de la anotación GeneratedValue pero parece que no funciona. ¡Inicializar id tampoco ayuda! (por ejemplo, Long id = 20L ).

¿Alguien podría arrojar algo de luz?

EDIT 2: confirmado: jugar con @GeneratedValue (estrategia = GenerationType.XXX) no lo resuelve

SOLUCIONADO: la recreación de la base de datos resolvió el problema

¿Fue útil?

Solución

En ocasiones, los cambios realizados en el modelo o en el ORM pueden no reflejarse con precisión en la base de datos, incluso después de una ejecución de SchemaUpdate .

Si el error realmente parece carecer de una explicación razonable, intente volver a crear la base de datos (o al menos crear una nueva) y colóquela con SchemaExport .

Otros consejos

Si desea que MySQL produzca automáticamente las claves primarias, debe indicarlo al crear la tabla. No tienes que hacer esto en Oracle.

En la clave principal debe incluir AUTO_INCREMENT . Vea el ejemplo a continuación.

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;  

Aquí está la Entidad

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

}

debe utilizar la actualización en su propiedad hbm2ddl. realice los cambios y actualícelos en Crear para que pueda crear la tabla.

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

Funcionó para mí.

Eche un vistazo a la estrategia de GeneratedValue . Por lo general, se ve algo así como:

@GeneratedValue(strategy=GenerationType.IDENTITY)

Otra sugerencia es verificar que usas un tipo válido para el campo generado automáticamente. Recuerda que no funciona con String, pero funciona con Long:

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

@Constraints.Required
public String contents;

La sintaxis anterior funcionó para generar tablas en MySQL usando Hibernate como proveedor JPA 2.0.

Tuve el mismo problema. Encontré el tutorial Ejemplo de asignación de hibernación uno a uno utilizando Anotación de clave externa y lo siguió paso a paso como se muestra a continuación:

Crear una tabla de base de datos con este 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)   
);

Aquí están las entidades con las tablas anteriores

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

El problema se resolvió.

Aviso: la clave principal debe configurarse como AUTO_INCREMENT

Vine aquí debido al mensaje de error, resultó que tenía dos tablas con el mismo nombre.

Solo agrega una restricción no nula

Tuve el mismo problema. Acabo de agregar una restricción no nula en la asignación xml. Funcionó

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

Eliminar la tabla de la base de datos manualmente y luego volver a ejecutar la aplicación funcionó para mí. En mi caso, la tabla no fue creada correctamente (con restricciones), supongo.

Tuve este problema. Mi error fue que había establecido los archivos insertables y actualizables como falsos y estaba intentando establecer el campo en la solicitud. Este campo se establece como NON NULL en DB.

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

Más tarde lo cambié a - insertable = true, actualizable = true

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

Funcionó perfectamente más tarde.

Verifique si el valor predeterminado para el ID de columna en una tabla en particular, si no se establece como predeterminado

Tuve el mismo problema. Estaba usando una tabla de unión y todo lo que tenía con un campo de identificación de fila y dos claves externas. No sé la causa exacta, pero hice lo siguiente

  1. MySQL actualizado a la comunidad 5.5.13
  2. Renombrar la clase y la tabla
  3. Asegúrate de que haya hashcode y métodos iguales

    @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 misma excepción se lanzó si una tabla de base de datos tenía una columna antigua no eliminada.

Por ejemplo: attribute_id NOT NULL BIGINT (20), y attributeId NOT NULL BIGINT (20),

Después de eliminar el atributo no utilizado, en mi caso contractId , el problema se resolvió.

Esto me sucedió con una relación @ManyToMany . Había anotado uno de los campos en la relación con @JoinTable , lo eliminé y usé el atributo mappedBy en @ManyToMany en su lugar.

Además de lo que se menciona anteriormente, no lo olvides al crear una tabla de SQL para hacer el INCREMENTO AUTOMÁTICO como en este ejemplo

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

Probé el código y, en mi caso, el siguiente código resuelve el problema. No había resuelto el esquema correctamente

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

Intenta agregar , catalog = " databasename " de la misma manera que lo hice.

,catalog="databasename"

En mi caso, Cambié las tablas ofensivas y el campo " id " En la pregunta que lo hice AUTO_INCREMENT, todavía tengo que averiguar por qué en el momento de la implementación no lo estaba haciendo " AUTO_INCREMENT " ¡Para que tenga que hacerlo yo solo!

¿Qué pasa con esto?

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

Espero que te ayude.

Tal vez ese sea el problema con el esquema de la tabla. suelte la tabla y vuelva a ejecutar la aplicación.

Intente cambiar el tipo de objeto Long al tipo primitivo long (si el uso de primitivas es correcto para usted).

Tuve el mismo problema y el cambio de tipo me ayudó.

Tuve este problema, por error había colocado la anotación @Transient sobre ese atributo en particular. En mi caso, este error tiene sentido.

Agregue un método hashCode () a su Entity Bean Class y vuelva a intentarlo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top