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!