6
votes

Hibernate ne renvoie qu'un seul résultat (après le changement de noms de table)

J'utilise Hibernate Récupérez les résultats de ma base de données MySQL dans mon projet Java. Récemment, j'avais beaucoup de données redondantes et je devais nettoyer manuellement la base de données en copiant les données requises dans de nouvelles tables, puis renommer la table nouvellement créée à la table ancienne.

Mais, désormais interroger la base de données avec Hibernate ne donne qu'une seule ligne comme résultat. J'ai vérifié manuellement la base de données et il existe plusieurs lignes différentes dans la base de données. Ma requête à hibernate est une chose comme ceci: xxx

utilisateurs contient 100 éléments mais tous sont identiques.

La cartographie de UserDto est ici .

aucune idée de ce qui se passe ici?


4 commentaires

Pouvez-vous ajouter le mappage hibernate pour la classe USERDTO et le schéma de la table correspondante dans dB. La raison la plus probable à cela est que vous avez mappé la mauvaise colonne comme id


S'il vous plaît dites-nous quelle est votre mappage, quelles sont vos données de base de données, et les requêtes SQL sont tirées (hibernate.show.sql = true) et votre méthode égale dans l'entité (ne pensez pas que cela importe car une liste est retournée mais ...)


@gkamal j'ai mis à jour la question en conséquence!


Pouvez-vous poster la requête SQL Hibernate est en train de tirer dans ce cas. Comme @nikem Réponse suggère une jointure à une Tomany peut également conduire à ce problème.


5 Réponses :


0
votes

Vérifiez votre cartographie de la classe UserDo dans la base de données. Je suppose que vous ne l'avez pas mappé sur la table que vous pensez faire. Alors que Sébastien a mentionné, définir Hibernate.show.sql vers True devrait faire cela évident.


1 commentaires

La cartographie est correcte. Utilisation de Session.Createequy renvoie également les résultats corrects. Je ne suis tout simplement pas sûr de savoir pourquoi les critères ne fonctionnent pas.



0
votes

Avez-vous supprimé les anciennes tables? Et dans le fichier de configuration Quelle est la valeur pour "hibernate.hbm2ddl.auto"?


3 commentaires

Je ne les ai pas supprimés mais je les ai renommés à quelque chose d'autre qui n'interfère pas avec les mappages. La valeur pour hibernate.hbm2ddl.auto est valider .


Une chose que vous pouvez essayer. Supprimez les tables nouvellement créées et laissez l'hibernate de créer la table pour vous en utilisant la valeur "hibernate.hbm2ddl.auto" comme "Créer". Une fois les tables créées, vous pouvez insérer de manière programmative via des instructions insertiques.


@Chandu je ne suis pas sûr de savoir pourquoi cela aiderait. Si les tables ont été renommées et copiées, le schéma devrait être le même. Dans mes projets 'HBM2DDL.Auto = Create' est uniquement autorisé à tester. Vous ne voulez vraiment pas d'hiberner créer le schéma pour une base de données de production, imo.



1
votes

Si votre classe UserDTO a des relations TOMANY, cela est tout à fait possible que l'externe de la participation extérieure sur eux entraîne de nombreux enregistrements qui contiennent tous les données d'utilisateur et les mêmes utilisateurs. Vous devez utiliser

session.createCriteria(UserDto.class).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)


2 commentaires

Merci. Je vais essayer ceci. Cependant, je peux obtenir toutes les données à l'aide de session.Createequery . Je ne sais pas pourquoi les critères ne fonctionnent pas cependant.


@Nikem: Cela pourrait être vrai si les relations de plusieurs personnes sont extraites avec impatience, mais je ne vois pas cela dans la cartographie. IIRC la valeur par défaut est fetchmode.lazy. Dans tous les cas, Hibernate ne cherchera pas plus d'un x-to-plusieurs à la fois, et il savent comment traiter les lignes redondantes dans la plupart des cas (dépend de la requête).



0
votes

Je pense que la raison est que ces enregistrements ont le même identifiant, alors hibernate les traite comme le même enregistrement. Vous pouvez le vérifier.


2 commentaires

Comment cela arriverait-il? Aucune clé primaire définie peut-être? Hibernate peut sembler se comporter étrangement si vous ne définissez pas les clés primaires. Si c'est le problème, alors ... peut-être qu'il est temps de prendre du clavier.


Les touches principales sont définies. Voir la cartographie



0
votes

J'ai eu le même problème. Dans mon cas, le problème détecté lorsque j'ai créé une table dans MySQL manuellement et j'ai essayé de lire des données de cette table à l'aide de Hibernate et d'une classe DTO. Après avoir vérifié mes champs de classe DTO et la table de base de données, j'ai compris qu'il existe une différence entre la colonne de table nommée "ID" et le champ de classe nommé dbid. Le code était quelque chose comme ceci: xxx

donc j'ai édité le nom et modifié le code: xxx

quel "id" était le bon Nom de la colonne de table de base de données et le problème a été résolu.


0 commentaires