8
votes

Hibernate écrase les données lorsqu'il persist / sauvegarde une entité

Je suis nouveau dans hibernate.Lorsque j'enregistre une entité particulière, alors il réécrit les données de l'existant.

J'ai utilisé ID comme auto généré comme ci-dessous: P>

mysql> select * from stud;
+----+--------+------+
| id | city   | name |
+----+--------+------+
|  1 | Mumbai | Test |
|  2 | Mumbai | Test |
+----+--------+------+
2 rows in set (0.00 sec)


0 commentaires

5 Réponses :


2
votes

Si vous souhaitez effectuer une mise à jour plutôt que d'ajouter une nouvelle ligne à la base de données à chaque fois, vous devez extraire l'entité souhaitée, faites les mises à jour souhaitées, puis enregistrez l'entité à nouveau.


0 commentaires

3
votes

Essayez d'utiliser SaveOpdate (..)

Notez que les entités JPA (hibernate) sont identifiées par leur @ID . Si votre objet a le même identifiant que celui de la DB, une mise à jour se produira. Sinon, logiquement, l'insertion se produira.


2 commentaires

De son exemple, il semble qu'il exécute un exemple de ligne de commande et s'attendre à ce que les exécutions ultérieures ne puisse pas ajouter de nouvelles entrées à la base de données.


Oui c'est vrai..mais y a-t-il d'autre manière pour cela? Si j'insère une valeur d'entité différente, il suffit de réécrire les données de l'une existante plutôt que de créer un nouvel enregistrement ..IF ID maximum de ma table est 2 que les données insérées suivantes doivent être sur 3ème.



19
votes

Je réalise que ceci est posé il y a un an, mais j'avais exactement le même problème que toi et j'ai pensé que je l'affaiterais au cas où quelqu'un d'autre l'ait.

Il s'est avéré qu'il s'agissait d'un paramètre de mon usine de session:

Recherchez le réglage hibernate.hbm2ddl.auto , vous l'avez probablement défini sur créer . Ce paramètre fait des choses lorsque votre usine de session est créée. Ce que créer est qu'il chute le schéma existant (au moins les tables qu'elle utilisera) et en crée une nouvelle, ce qui l'apparaît comme il écrase les lignes de votre table.

Il y a quelques valeurs différentes que vous pouvez choisir ici. Pour le développement, je crois que vous voudriez qu'il soit défini update car il créera de nouvelles tables pour vous si elles n'existent pas déjà (comme la création), mais si la table existe déjà qu'il mettra à jour le schéma.

Pour la production, vous devrait bâton sur valider car il ne modifiera pas votre schéma, juste validez ça: )

Pour plus de détails sur les différentes valeurs, vérifiez Cette excellente réponse


0 commentaires

0
votes

Ajout d'une ligne dans votre table de base de données créée peut aider xxx

auto_incrènement incrémente le compte ID comme et lorsque vous ajoutez une ligne dans la table.


0 commentaires

0
votes

Si vous utilisez le générateur de classe Auto, les enregistrements seront automatiquement ajoutés à un nouvel identifiant incrémenté automatique. Et les mêmes données dans l'enregistrement précédent seront également écrites dans l'ID suivant également. Donc, si vous insérez une nouvelle ligne, modifiez le test de données et Mumbai chaque fois que vous exécutez l'application (mauvaise pratique) ou utilisez la classe de scanner pour lire les données du clavier et la transmettre de manière dynamique au setter. J'espère que vous l'avez compris.


0 commentaires