Retirez ensuite la Requête échoue en JPA/Hibernate (supprimé entité passé à persister)
J'ai un problème avec la suppression des entités dans mon JPA application: fondamentalement, je ne dans cet EJB méthode commerciale:
load photo list ;
for each photo {
//UPDATE
remove TagPhoto element from @OneToMany relation
//DISPLAY
create query involving TagPhoto
...
}
et cette dernière requête jette toujours un EntityNotFoundException (supprimé entité passé à persister: [...TagPhoto#])
Je pense que je comprends le sens de cette exception, comme un problème de synchronisation causée par ma Enlever, mais comment puis-je me débarrasser de lui?
EDIT: voici la pile de l'exception:
Caused by: javax.persistence.EntityNotFoundException: deleted entity passed to persist: [net.wazari.dao.entity.TagPhoto#<null>]
at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:621)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:74)
at net.wazari.dao.jpa.TagFacade.loadVisibleTags(TagFacade.java:108)
et la mise en correspondance entre la Balise-TagPhoto-Photo
public class Tag implements Serializable {
...
@OneToMany(cascade = CascadeType.ALL, mappedBy = "tag")
private List<TagPhoto> tagPhotoList;
}
public class TagPhoto implements Serializable {
...
@JoinColumn(name = "Tag", referencedColumnName = "ID")
@ManyToOne(optional = false)
private Tag tag;
@JoinColumn(name = "Photo", referencedColumnName = "ID")
@ManyToOne(optional = false)
private Photo photo;
}
public class Photo implements Serializable {
...
@OneToMany(cascade = CascadeType.ALL , mappedBy = "photo")
private List<TagPhoto> tagPhotoList;
}
(il a été automatiquement généré par Netbeans quand j'ai créé le projet)
EDIT: est-ce que cela signifie que tagPhoto != tagPhoto.getTag().getTagPhotoList().get(...) != tagPhoto.getPhoto().getTagPhotoList().get(...)
?
et comment dois-je les supprimer? iterator.remove
ne devrait pas être d'une quelconque utilité, et je pense que les trois em.remove()
ferait trois fois la même opération ...
OriginalL'auteur Kevin | 2010-05-30
Vous devez vous connecter pour publier un commentaire.
Pour être honnête, c'est difficile à dire sans les mappages (surtout la cascade d'options), sans l'exacte trace de la pile et sans le code réel comme le pseudo-code est très probablement ne pas montrer le vrai problème. Si cette réponse est plus un coup de feu dans l'obscurité (et vous devriez envisager d'afficher les données).
Je suppose que vous vous appelez
remove()
sur unTagPhoto
exemple que vous n'êtes pas le retrait de l'un-à-plusieurs association. Ainsi, lorsque leEntityManager
tente de mettre à jour le parent Photo, il peut en effet essayer de persister à la suppression d'une entité, d'où l'exception.Mise à jour: Vous devez supprimer le
TagPhoto
exemple de deux collections qui en contiennent:Remarque que les choses sont en réalité un peu plus compliqué parce que NetBeans généré une Entité pour la table de jointure (TagPhoto). Il serait un peu plus facile si vous aviez un plusieurs-à-plusieurs association entre
Photo
etTag
. Mais dans tous les cas, lorsque vous supprimez une entité, vous devez le retirer de associations, JPA ne pas le faire pour vous.Non, vous devez mettre à jour les collections manuellement c'est à dire de supprimer le
TagPhoto
exemple de deuxtagPhotoList
(enPhoto
etTag
) ou JPA va essayer de les conserver à l'arrière (car ils font toujours partie des associations). C'est très probablement la cause racine du problème.Upvoted, était bien mon problème.
OriginalL'auteur Pascal Thivent
Peut-être un problème avec la synchronisation.
Essayez d'appeler
Session.flush()
avant de créer le TagPhoto.OriginalL'auteur Georg Leber
Je suis tombé sur presque une situation similaire et résolu: il suffit de supprimer les références à partir de la propriétaire de côté.Maintenant, dans votre cas, TagPhoto est le propriétaire des relations pour la Balise ainsi que Photo. Tout ce que vous devez faire est de requête pour le TagPhoto à partir de la côte et de l'enlever et de mettre à jour la référence sur le propriétaire de côté(s).
pour, par exemple, dans un service qui est couvert
Assurez-vous également que vous n'appelez pas l'entityManager.flush() explicitement à partir de votre API(s). Il doit être appelé par le transactionManager. Une fois la transaction terminée.
OriginalL'auteur Hussain Pithawala