org.hibernate.ObjectNotFoundException: aucune ligne avec l'identifiant donné n'existe
J'ai eu un problème depuis Hibernate 4.1.8 résultant de l'exception suivante:
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [test.hibernate.TestPrepravkaOsobaSAdresou$Uvazek#2]
J'ai un simple OneToMany association entre deux entités:
@Entity(name = "Ppv")
@Table(name = "PPV")
public static class Ppv {
@Id
Long ppvId;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "ppv")
Set<Uvazek> uvazeks = new HashSet<Uvazek>(0);
}
@Entity(name = "Uvazek")
@Table(name = "UVAZEK")
public static class Uvazek {
@Id
Long uvazekId;
@ManyToOne
@JoinColumn(name = "PPV_FXID")
Ppv ppv;
}
et un cas de test où j'ai un Tvc et de deux Uvazek. Lorsque je charge et détacher un Ppv, de supprimer une Uvazek associé chargé de Tvc et de fusion Ppv j'obtiens une exception.
jdbcTemplate.execute("insert into PPV values(1)");
jdbcTemplate.execute("insert into UVAZEK values(2, 1)");
jdbcTemplate.execute("insert into UVAZEK values(3, 1)");
Ppv ppv = (Ppv) getSession().get(Ppv.class, 1l);
getSession().clear();
getSession().delete(getSession().get(Uvazek.class, 2l));
getSession().flush();
getSession().merge(ppv);
getSession().flush(); //Causes the exception
Pendant le Ppv de fusion, Hibernate essaie de charger le supprimé Uvazek. Même si Uvazek est supprimé, Hibernate a toujours les informations à ce sujet dans
org.hibernate.collection.internal.AbstractPersistentCollection.storedSnapshot
sur uvazek est mis sur le détachement du Ppv. Dans une version précédente (<4.1.8) cela fonctionne. Dans cet exemple simple que je puisse la réparer en ajoutant orphanRemoval=true
sur uvazeks ensemble sur le Ppv et au lieu de supprimer uvazek supprimer de uvazeks mis sur la carte.
Donc ma question est: Est-ce une Hibernate bug ou une mauvaise pratique?
source d'informationauteur user3206615
Vous devez vous connecter pour publier un commentaire.
Le problème est que le Uvazek avec id = 2 est tenté d'être fusionnées. Hibernate voit qu'il a une clé, mais il ne sait pas si l'objet est sale, il n'est donc pas clair si une mise à jour SQL doit être fait.
Mais parce que la clé est de 2, Hibernate sait que l'objet doit exister dans la base de données, de sorte qu'il essaie de charger l'objet afin de le comparer à la version qu'il a juste reçu dans la mémoire, pour voir si l'objet a un certain nombre de modifications qui doivent être synchronisés à la base de données.
Mais le select ne renvoie pas de résultat, de sorte que Hibernate a des informations contradictoires: d'une part la base de données indique que l'objet n'existe pas. D'autre part, l'objet en mémoire, dit l'objet doit exister avec la touche 2. Il n'y a aucun moyen de déterminer ce qui est correct, de sorte que le
ObjectNotFoundException
est levée.Ce qui s'est passé est que, avant cette version du code a été accidentellement en se basant sur un bug que, dans l'intervalle suis fixé, de sorte que cela ne fonctionne plus.
La meilleure pratique est d'éviter d'effacer et de l'utiliser seulement en cas de besoin, comme une optimisation de la mémoire, par compensation uniquement les objets que vous savez ne sera pas modifié ou nécessaires dans la même séance, de plus, avoir un coup d'oeil à Est Session clear() considéré comme nocif.
Vous devez également supprimer la référence à Uvazek de Ppv. Sinon, Hibernate tente de restaurer la relation lors de la fusion en arrière et ne parvient pas, parce que vous avez supprimé le référencés Uvazek.
C'est aussi pourquoi l'ajout d'orphelin de suppression fonctionne pour vous.
J'ai eu le même Hibernate exception.
Après le débogage pendant un certain temps, j'ai réalisé que le problème est causé par l'Orphelin enregistrements enfants.
Ce que j'ai fait est, trouver la Clé Étrangère de références correspondant à la Table liée à la Fève.
Trouver la clé étrangère références dans SQL developer
1.Enregistrez le code XML ci-dessous de code dans un fichier (fk_reference.xml)
2.Ajouter l'UTILISATEUR DÉFINI extension de SQL Developer
Cliquez sur "Ok" puis redémarrez SQL Developer
3.Accédez à n'importe quelle table et vous serez en mesure de voir un onglet supplémentaire à côté de SQL, étiquetés FK Références, l'affichage de FK informations.
4.Référence
http://www.oracle.com/technetwork/issue-archive/2007/07-jul/o47sql-086233.html
Pour trouver les enregistrements Orphelins dans tous les tableaux
Supprimer ces enregistrements Orphelins, valider les modifications et redémarrer le serveur si nécessaire.
Cela a résolu mon exception. Vous pouvez essayer la même chose.