La Force de requête d'Hibernate pour accéder à la base de données
J'ai chargé d'une entité dans ma transaction et que vous avez changé une propriété de l'entité. La transaction n'est pas encore engagée. Maintenant, je voudrais obtenir la valeur d'origine de la propriété modifiée.
J'ai essayé avec une requête HQL comme select p.property from Person p where p.id = 1
avec l'ID de l'entité chargée de la transaction.
J'ai mis query.setHint("org.hibernate.cacheMode", CacheMode.IGNORE);
avant l'exécution de la requête. Mais pas de succès. Hibernate renvoie la valeur définie dans la transaction en cours, et non pas celui de la base de données.
Est-il un moyen de contourner cela?
Ne pas vous retrouver avec le problème où Hibernate se plaint de la même entité dans la session deux fois? Semble que vous pourriez voulez revoir la mise en œuvre peut-être.
OriginalL'auteur tobiasbayer | 2010-09-13
Vous devez vous connecter pour publier un commentaire.
En bref: la piste de l'ancienne valeur vous-même.
Hibernate charge une version unique d'une entité dans la session (le premier niveau de cache) pour un identificateur de base de données. Cela ne fonctionnera pas.
Cette astuce est utilisée pour affecter la cache de requête (qui s'appuient sur le second niveau de cache), ce qui n'affecte pas votre "problème".
Soit
session.refresh()
forcer un rechargement de votre entité (et vous perdrez les modifications)OriginalL'auteur Pascal Thivent
La statelesssession n'a fonctionné pour moi.
OriginalL'auteur andrefaria
Cela peut aider:
(À partir de http://docs.jboss.org/hibernate/stable/core/reference/en/html/performance.html, section 20.4.2).
Cependant, il est prévu d'utiliser lorsque d'autres processus de mise à jour de la DB, et doit être utilisé avec précaution.
Votre cas est différent. Comme cette méthode se produit en dehors de toute transaction, vous devez être sûr qu'il n'entre pas en conflit avec votre conception. Peut-être que vous pouvez restructurer le flux d'appel pour éviter ce comportement, et de récupérer le terrain à partir d'une autre source ou avant la modification dans le cache...
OriginalL'auteur Sebastian
La seule façon de le faire serait d'exécuter la requête à l'extérieur de la transaction en cours.
OriginalL'auteur james