Maison  >  Article  >  Java  >  Pourquoi My Spring Data JPA @Query Update ne met-il pas à jour les données ?

Pourquoi My Spring Data JPA @Query Update ne met-il pas à jour les données ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-25 17:42:02373parcourir

Why is My Spring Data JPA @Query Update Not Updating Data?

Mise à jour JPA des données Spring @Query ne mettant pas à jour les données

Malgré une requête de mise à jour définie :

<code class="java">@Modifying
@Transactional
@Query("UPDATE Admin SET firstname = :firstname, lastname = :lastname, login = :login, superAdmin = :superAdmin, preferenceAdmin = :preferenceAdmin, address =  :address, zipCode = :zipCode, city = :city, country = :country, email = :email, profile = :profile, postLoginUrl = :postLoginUrl WHERE id = :id")
public void update(...);</code>

et en essayant de l'utiliser dans un test d'intégration :

<code class="java">adminRepository.update("Toto", "LeHeros", admin0.getLogin(), admin0.getSuperAdmin(), admin0.getPreferenceAdmin(), admin0.getAddress(), admin0.getZipCode(), admin0.getCity(), admin0.getCountry(), admin0.getEmail(), admin0.getProfile(), admin0.getPostLoginUrl(), admin0.getId());
Admin loadedAdmin = adminRepository.findOne(admin0.getId());
assertEquals("Toto", loadedAdmin.getFirstname()); // Assertion failed
assertEquals("LeHeros", loadedAdmin.getLastname()); // Assertion failed</code>

les champs de la base de données restent leurs valeurs initiales, provoquant l'échec du test. Même l'ajout d'un vidage avant la requête findOne :

<code class="java">adminRepository.flush();</code>

ne résout pas le problème.

L'instruction de mise à jour peut être observée dans les journaux, indiquant que Spring Data génère et exécute le requête correctement. Cependant, les résultats de la requête findOne ultérieure ne sont pas cohérents avec les modifications apportées par la mise à jour.

Une raison possible de ce comportement est que EntityManager ne vide pas automatiquement les modifications par défaut. Pour résoudre ce problème, l'option clearAutomatically peut être ajoutée à l'annotation @Modifying :

<code class="java">@Modifying(clearAutomatically = true)
@Query("UPDATE Admin SET ...")
public void update(...);</code>

Cela devrait amener EntityManager à vider automatiquement toutes les modifications en attente après l'exécution de la requête de mise à jour, garantissant ainsi que les modifications sont conservées et reflétées. dans les requêtes ultérieures.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn