Je suis confronté à ce que je pense être un problème simple avec Hibernate, mais je ne peux pas le résoudre (les forums Hibernate étant inaccessibles n'aide certainement pas).
J'ai une classe simple que j'aimerais persister, mais continuez à obtenir:
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 ]
Le code pertinent pour la classe persistante est:
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;
}
}
Et le code en cours d'exécution est tout simplement clair:
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();
}
J'ai essayé quelques «stratégies» dans l' GeneratedValue
annotation mais cela ne semble tout simplement pas fonctionner. L'initialisation id
n'aide pas non plus! (par exemple Long id = 20L
).
Quelqu'un pourrait-il faire la lumière?
EDIT 2: confirmé: jouer avec @GeneratedValue(strategy = GenerationType.XXX)
ne le résout pas
RESOLU: recréer la base de données a résolu le problème
java
hibernate
jpa
persistence
André Chalella
la source
la source
GenerationType
à@GeneratedValue
partirIDENTITY
deAUTO
et cela a fonctionné pour moi. En outre, vous pouvez définir une propriété d'incrémentation automatique dans MySQL.Réponses:
Parfois, les modifications apportées au modèle ou à l'ORM peuvent ne pas être reflétées avec précision dans la base de données, même après l'exécution de
SchemaUpdate
.Si l'erreur semble manquer d'explication sensée, essayez de recréer la base de données (ou au moins d'en créer une nouvelle) et de l'échafauder avec
SchemaExport
.la source
SET foreign_key_checks = 0;
c'est votre ami. AssurezSET foreign_key_checks = 1;
-vous simplement que vous avez terminé.Si vous voulez que MySQL produise automatiquement des clés primaires, vous devez le dire lors de la création de la table. Vous n'êtes pas obligé de faire cela dans Oracle.
Sur la clé primaire, vous devez inclure
AUTO_INCREMENT
. Voir l'exemple ci-dessous.Voici l'entité
la source
vous devez utiliser update dans votre propriété hbm2ddl. apportez les modifications et mettez-le à jour en Créer afin qu'il puisse créer la table.
Cela a fonctionné pour moi.
la source
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id;
Et avec la valeurcreate
de lahbm2ddl.auto
propriété, les changements appliqués dans mon schéma de base de données. Merci beaucoup ....Jetez un œil à
GeneratedValue
la stratégie de. Cela ressemble généralement à quelque chose comme:la source
Supprimer manuellement la table de la base de données, puis réexécuter l'application a fonctionné pour moi. Dans mon cas, la table n'a pas été créée correctement (avec des contraintes) je suppose.
la source
J'ai eu ce problème. Mon erreur était que j'avais défini les fichiers insérables et actualisables comme faux et que j'essayais de définir le champ dans la demande. Ce champ est défini comme NON NULL dans DB.
Plus tard, je l'ai changé en - insertable = true, updatable = true
Cela a parfaitement fonctionné plus tard.
la source
Je suis venu ici à cause du message d'erreur, il s'avère que j'avais deux tables avec le même nom.
la source
Une autre suggestion consiste à vérifier que vous utilisez un type valide pour le champ généré automatiquement. N'oubliez pas que cela ne fonctionne pas avec String, mais cela fonctionne avec Long:
La syntaxe ci-dessus a fonctionné pour générer des tables dans MySQL en utilisant Hibernate en tant que fournisseur JPA 2.0.
la source
J'ai eu le même problème. J'ai trouvé le tutoriel Exemple de mappage One-To-One Hibernate utilisant l'annotation de clé étrangère et je l'ai suivi étape par étape comme ci-dessous:
Créez une table de base de données avec ce script:
Voici les entités avec les tableaux ci-dessus
Le problème a été résolu.
Remarque: la clé primaire doit être définie sur AUTO_INCREMENT
la source
Ajoutez simplement une contrainte non nulle
J'ai eu le même problème. Je viens d'ajouter une contrainte non nulle dans le mappage xml. Ça a marché
la source
C'est peut-être le problème avec le schéma de table. supprimez la table et réexécutez l'application.
la source
En plus de ce qui est mentionné ci-dessus, n'oubliez pas lors de la création de la table sql de faire l' incrémentation automatique comme dans cet exemple
la source
Veuillez vérifier si la valeur par défaut de l'ID de colonne dans une table particulière. Si elle n'est pas définie par défaut
la source
J'ai eu le même problème. J'utilisais une table de jointure et tout ce que j'avais avec un champ d'identification de ligne et deux clés étrangères. Je ne connais pas la cause exacte mais j'ai fait ce qui suit
Assurez-vous d'avoir des méthodes de hashcode et d'égalité
la source
La même exception était levée si une table DB avait une ancienne colonne non supprimée.
Par exemple:
attribute_id NOT NULL BIGINT(20),
etattributeId NOT NULL BIGINT(20),
Après avoir supprimé l'attribut non utilisé, dans mon cas contractId , le problème a été résolu.
la source
Cela m'est arrivé avec une
@ManyToMany
relation. J'avais annoté l'un des champs de la relation avec@JoinTable
, je l'ai supprimé et j'ai utilisé l'mappedBy
attribut sur @ManyToMany à la place.la source
J'ai essayé le code et dans mon cas, le code ci-dessous résout le problème. Je n'avais pas réglé le schéma correctement
Veuillez essayer d'ajouter
,catalog="databasename"
la même chose que moi.la source
Dans mon cas, j'ai modifié les tables incriminées et le champ "id" en question je l'ai fait AUTO_INCREMENT, j'ai encore besoin de comprendre pourquoi au moment du déploiement il ne le faisait pas "AUTO_INCREMENT" pour que je doive le faire moi-même!
la source
Et ça:
J'espère que ça t'aide.
la source
Essayez de changer le
Long
type d'objet en typelong
primitif (si l'utilisation de primitives vous convient).J'ai eu le même problème et le changement de type m'a aidé.
la source
J'ai eu ce problème, par erreur j'avais placé une
@Transient
annotation au-dessus de cet attribut particulier. Dans mon cas, cette erreur a du sens.la source
"Le champ 'id' n'a pas de valeur par défaut" car vous ne l'avez pas déclaré
GenerationType.IDENTITY
dansGeneratedValue
Annotation.la source
Ce problème est dû au fait que parfois vous devez à nouveau mettre à jour / créer la base de données ou parfois si vous avez ajouté le champ dans la table de base de données mais pas dans la classe d'entité, il ne peut pas insérer de valeur nulle ou zéro, donc cette erreur est survenue. Vérifiez donc les classes side.Db et Entity.
la source
Lorsque votre champ n'est pas nullable, une valeur par défaut doit être spécifiée lors de la création de la table. Recréez une table avec AUTO_INCREMENT correctement initialisé afin que DB ne nécessite pas de valeur par défaut car il la générera par lui-même et n'y mettra jamais NULL.
);
https://www.w3schools.com/sql/sql_autoincrement.asp
la source
J'ai une telle erreur dans GCP cloud sql lorsque le champ de modèle ne correspond pas au champ de table correct dans la base de données. Exemple: quand dans le champ de modèle, la
fieldName
table dans la base de données devrait avoir le champ La
field_name
correction du nom du champ de la table m'a aidé.la source
Ajoutez une méthode
hashCode()
à votre classe Entity Bean et réessayezla source