“Aucune ligne avec l’identifiant donné n’existe” bien qu’il existe

J’utilise Hibernate et je reçois

Exception dans le thread “principal” org.hibernate.ObjectNotFoundException: Aucune ligne avec l’identificateur donné n’existe: [# 271]

Ce qui est assez étrange avec cette erreur, c’est que l’object avec l’identifiant donné existe dans la firebase database. J’ai inséré l’enregistrement problématique dans une autre exécution de l’application. Si j’y accède lors de la même exécution (c’est-à-dire de la même session d’hibernation), la récupération des données ne pose aucun problème.

Juste parce que cela pourrait être une faute de la cartographie:

public class ProblemClass implements Persistent { @ManyToOne(optional = false) private MyDbObject myDbObject; } public class MyDbObject implements Persistent { @OneToMany(mappedBy = "myDbObject") private List problemClasses; @ManyToOne(optional = false) private ThirdClass thirdClass; } 

Je n’ai absolument aucune idée, même où regarder. Toutes les suggestions sont très appréciées!

Juste pour clarifier: les données ont été insérées dans un autre RUN de l’application. Il est définitivement dans la firebase database, comme je peux le voir via une requête SQL après la fin de l’application. Et après cela, c’est-à-dire lors du redémarrage de l’application, j’obtiens l’erreur dans la première requête de la firebase database – pas de suppression, pas de retour en arrière impliqué.

Ajout: Parce que cela a été demandé, voici le code pour récupérer les données:

 public List getProblemClasses() { Query query = session.createQuery("from ProblemClass"); return query.list(); } 

Et juste pour le compléter, voici le code générique pour l’insérer (avant de le récupérer dans un autre RUN de l’application):

 public void save(Persistent persistent) { session.saveOrUpdate(persistent); } 

Eureka, je l’ai trouvé!

Le problème était le suivant:

Les données de la table ThirdClass pas été conservées correctement. Depuis que ces données ont été référencées à partir de MyDbObject via

 optional = false 

Hibernate a créé une jointure interne, renvoyant ainsi un résultat vide pour la jointure. Parce que les données étaient là si elles étaient exécutées en une seule session (dans le cache, je suppose), cela ne posait aucun problème.

MySQL n’applique pas l’intégrité de la clé étrangère, ne se plaignant donc pas de l’insertion de données corrompues.

Solution: facultatif = insertion correcte ou correcte des données.

Raisons possibles:

  1. La ligne a été insérée par la première session, mais la transaction n’a pas été validée lorsque la deuxième session a tenté d’y accéder.
  2. La première session est annulée pour une raison quelconque.

On dirait que votre insertion de transaction est annulée

La principale raison derrière ce problème est la non-concordance des données, par exemple, j’ai une classe de mappage d’entité appelée “X” et elle a la colonne “column1” et elle fait référence à la colonne “Y” colonne “column1” comme ci-dessous

 @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "column1", referencedColumnName = "column1") public Y getColumn1() { return Y; } 

Dans ce cas, si la table X column1 a la valeur mais que la table Y column1 n’a pas la valeur. Ici le lien sera échoué.

C’est la raison pour laquelle nous aurons une exception objectNotFound Hibernate

Ce problème peut également être résolu en créant un modèle de données approprié, par exemple en créant une indexation et des contraintes appropriées (clé primaire / clé étrangère).

Cela pourrait être votre cas, veuillez vérifier ma réponse sur un autre post.

https://stackoverflow.com/a/40513787/6234057

J’ai eu la même exception Hibernate.

Après avoir débogué pendant un certain temps, j’ai réalisé que le problème était causé par les enregistrements enfants Orphan.

Comme beaucoup se plaignent, quand ils recherchent le disque, il existe. Ce que j’ai compris, c’est que le problème n’est pas dû à l’existence de l’enregistrement mais à l’hibernation qui n’a pas été trouvée dans la table, mais à l’enregistrement des enfants orphelins.

Les enregistrements qui font référence aux parents non existants!

Ce que j’ai fait est de trouver les références de clé étrangère correspondant à la table liée au bean.

Pour trouver des références de clés étrangères dans SQL developer

1.Enregistrez le code XML ci-dessous dans un fichier (fk_reference.xml)

   <![CDATA[FK References]]>       

2.Ajouter l’extension USER DEFINED à SQL Developer

  • Outils> Préférences
  • Base de données> Extensions définies par l’utilisateur
  • Cliquez sur le bouton “Ajouter une ligne”
  • Dans Type, choisissez “EDITEUR”, Emplacement – où vous avez enregistré le fichier xml ci-dessus
  • Cliquez sur “Ok” puis redémarrez SQL Developer.

    3. Accédez à n’importe quelle table et vous pourrez voir un onglet supplémentaire à côté de SQL, intitulé Références FK, affichant des informations FK.

    4. référence

  • http://www.oracle.com/technetwork/issue-archive/2007/07-jul/o47sql-086233.html

  • Comment trouver les tables qui référencent une table donnée dans Oracle SQL Developer?

Pour rechercher les enregistrements orphelins dans toutes les tables référencées

sélectionnez * dans CHILD_TABLE où FOREIGNKEY n’est pas dans (sélectionnez PRIMARYKEY dans PARENT_TABLE);

Supprimez ces enregistrements orphelins, validez les modifications et redémarrez le serveur si nécessaire.

Cela a résolu mon exception. Vous pouvez essayer la même chose.

Veuillez mettre à jour votre fichier de configuration Hibernate comme indiqué ci-dessous:

 property start tag name="hbm2ddl.auto" create/update property close tag 

J’ai constaté que dans Oracle, ce problème peut également être causé par un problème d’permissions. L’instance ProblemClass à laquelle l’instance MyDbObject fait référence peut exister, mais dispose d’permissions qui ne permettent pas à l’utilisateur actuel de la voir, même si l’utilisateur peut voir le MyDbObject actuel.