Me enfrento a lo que creo que es un problema simple con Hibernate, pero no puedo resolverlo (los foros de Hibernate que son inalcanzables ciertamente no ayudan).
Tengo una clase simple que me gustaría persistir, pero sigo obteniendo:
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();
}
Intenté algunas "estrategias" dentro de la GeneratedValue
anotación, 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(strategy = GenerationType.XXX)
no lo resuelve
SOLUCIONADO: recrear la base de datos resolvió el problema
java
hibernate
jpa
persistence
André Chalella
fuente
fuente
GenerationType
en@GeneratedValue
a partirIDENTITY
deAUTO
y funcionó para mí. Además, puede tener la propiedad de incremento automático establecida en MySQL.Respuestas:
A veces, 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 sensata, intente recrear la base de datos (o al menos crear una nueva) y andamiarla con ella
SchemaExport
.fuente
SET foreign_key_checks = 0;
es tu amigo. Solo asegúrateSET foreign_key_checks = 1;
cuando hayas terminado.Si desea que MySQL produzca claves primarias automáticamente, 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.Aquí está la entidad
fuente
debe estar utilizando la actualización en su propiedad hbm2ddl. realice los cambios y actualícelo a Crear para que pueda crear la tabla.
Funcionó para mi.
fuente
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id;
Y con el valorcreate
en lahbm2ddl.auto
propiedad los cambios aplicados en mi Esquema de base de datos. Muchas gracias ...Echa un vistazo a
GeneratedValue
la estrategia. Por lo general, se parece a:fuente
Dejar 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 se creó correctamente (con restricciones), supongo.
fuente
Tuve este problema Mi error fue establecer los archivos insertables y actualizables como falsos e intentaba establecer el campo en la solicitud. Este campo se establece como NO NULL en DB.
Más tarde lo cambié a: insertable = verdadero, actualizable = verdadero
Funcionó perfectamente más tarde.
fuente
Vine aquí debido al mensaje de error, resulta que tenía dos tablas con el mismo nombre.
fuente
Otra sugerencia es verificar que use un tipo válido para el campo generado automáticamente. Recuerde que no funciona con String, pero funciona con Long:
La sintaxis anterior funcionó para generar tablas en MySQL usando Hibernate como proveedor de JPA 2.0.
fuente
Yo tuve el mismo problema. Encontré el tutorial Ejemplo de mapeo uno a uno de Hibernate usando Anotación de clave externa y lo seguí paso a paso como a continuación:
Cree una tabla de base de datos con este script:
Aquí están las entidades con las tablas anteriores.
El problema fue resuelto.
Aviso: la clave principal debe establecerse en AUTO_INCREMENT
fuente
Simplemente agregue una restricción no nula
Yo tuve el mismo problema. Acabo de agregar una restricción no nula en el mapeo xml. Funcionó
fuente
Tal vez ese sea el problema con el esquema de la tabla. suelte la tabla y vuelva a ejecutar la aplicación.
fuente
Además de lo mencionado anteriormente, no olvides al crear la tabla sql para hacer el INCREMENTO AUTOMÁTICO como en este ejemplo
fuente
Compruebe si el valor predeterminado para el ID de columna en la tabla en particular, si no lo establece como predeterminado
fuente
Yo tuve el mismo problema. Estaba usando una tabla de unión y todo lo que tenía con un campo de id de fila y dos claves foráneas. No sé la causa exacta pero hice lo siguiente
Asegúrate de tener códigos hash e iguales
fuente
Se produjo la misma excepción si una tabla de base de datos tenía una columna antigua no eliminada.
Por ejemplo:
attribute_id NOT NULL BIGINT(20),
yattributeId NOT NULL BIGINT(20),
Después de eliminar el atributo no utilizado, en mi caso contractId , el problema se resolvió.
fuente
Esto me pasó con una
@ManyToMany
relación. Había anotado uno de los campos en la relación@JoinTable
, lomappedBy
eliminé y usé el atributo en @ManyToMany en su lugar.fuente
Probé el código y, en mi caso, el siguiente código resuelve el problema. No había resuelto el esquema correctamente
Intenta agregar
,catalog="databasename"
lo mismo que hice.fuente
En mi caso, modifiqué las tablas ofensivas y el campo "id" en cuestión. Lo hice AUTO_INCREMENT, todavía necesito descubrir por qué en el momento del despliegue no lo estaba haciendo "AUTO_INCREMENT" ¡así que tengo que hacerlo solo!
fuente
¿Qué hay de esto?
Espero que te ayude.
fuente
Intente cambiar el
Long
tipo de objeto a tipolong
primitivo (si usar primitivas está bien para usted).Tuve el mismo problema y cambiar de tipo me ayudó.
fuente
Tuve este problema, por error puse una
@Transient
anotación sobre ese atributo en particular. En mi caso este error tiene sentido.fuente
"El campo 'id' no tiene un valor predeterminado" porque no declaró
GenerationType.IDENTITY
enGeneratedValue
Anotación.fuente
Este problema se debe a que a veces necesita actualizar / crear nuevamente la base de datos o, a veces, si ha agregado el campo en la tabla db pero no en la clase de entidad, entonces no puede insertar ningún valor nulo o cero, por lo que se produjo este error. Así que verifique ambos lados. Clase DB y Entidad.
fuente
Cuando su campo no es anulable, requiere que se especifique un valor predeterminado en la creación de la tabla. Recree una tabla con AUTO_INCREMENT correctamente inicializada para que DB no requiera un valor predeterminado ya que lo generará por sí mismo y nunca pondrá NULL allí.
);
https://www.w3schools.com/sql/sql_autoincrement.asp
fuente
Tengo ese error en la nube GCP sql cuando el campo del modelo no coincide con el campo de tabla correcto en db. Ejemplo: cuando en el campo modelo hay una
fieldName
tabla en db, debería tener un campo
field_name
.fuente
Agregue un método
hashCode()
a su clase de Bean de entidad y vuelva a intentarlofuente