Printemps JpaRepository - Attacher et Détacher entité
Je suis en utilisant le printemps de démarrage et mise en veille prolongée de plus de jpa. Je suis à l'aide de JpaRepository interface pour mettre en place mes dépôts. Comme avec la suite UserRepository
public interface UserRepository extends JpaRepository<User, Long> {
}
Je veux réaliser suivant
- Charger une entité Utilisateur.
- Modifier l'état de l'entité objet, par ex. de l'utilisateur.setName("foo")
- Faire un système externe d'un webservice appel. Enregistrer le résultat de l'appel en DB
- Uniquement sur le succès de la réponse de ce webservice appel, enregistrer le nouvel état de l'utilisateur dans le dépôt.
Toutes les étapes ci-dessus ne sont pas produit dans une transaction, c'est à dire le service externe appel de transaction.
Lorsque je sauvegarde mon webservice résultat en DB par l'intermédiaire de son référentiel, mes changements de l'Utilisateur de l'entité sont également enregistrées. Selon ma compréhension, c'est en raison de la consommation de sous-tendre le contexte de persistance à l'étape # 3. Après quelques google, je pense que je peux atteindre mon but, si je peux détacher mon entité user de la première étape et la rattacher à l'étape 4.
S'il vous plaît confirmer si ma compréhension est correcte et comment je peux faire? Il n'y a pas de méthode dans JpaRepository interface de détacher une entité.
Voici le code pour illustrer
public void updateUser(int id, String name, int changeReqId){
User mUser = userRepository.findOne(id); //1
mUser.setName(name); //2
ChangeRequest cr = changeRequestRepository.findOne(changeReqId);
ChangeResponse rs = userWebService.updateDetails(mUser); //3
if(rs.isAccepted()){
userRepository.saveAndFlush(mUser); //4
}
cr.setResponseCode(rs.getCode());
changeRequestRepository.saveAndFlush(cr); //this call also saves the changes at step 2
}
Grâce
Serait-il possible de faire des appels dans l'ordre suivant: 1,3,4,2?
OriginalL'auteur amique | 2014-11-07
Vous devez vous connecter pour publier un commentaire.
Si vous êtes en utilisant JPA 2.0, vous pouvez utiliser EntityManager#detach() pour détacher une seule entité de contexte de persistance. Aussi, Hibernate a un Session#evict() qui sert le même but.
Depuis
JpaRepository
ne fournit pas cette fonctionnalité, vous pouvez ajouter une implémentation personnalisée à elle, quelque chose comme celaJe n'ai pas testé ce code, mais vous devriez être capable de le faire fonctionner. Vous pourriez même essayer de mettre la main sur
EntityManager
dans votre classe de service (oùupdateUser()
est) avec@PersistenceContext
, et pour éviter l'agitation de l'ajout de la mise en œuvre du référentiel.@Repository
à la mise en œuvre dans votre exemple de code, sinon le dépôt personnalisées ne peuvent pas être autocâblés.)Il ne fonctionne pas pour moi avec le printemps 4.
La même approche utilisée pour CrudRepository ?
N'essayez pas, mais doit être le même
OriginalL'auteur Predrag Maric
entityManager.clear()
déconnecte toutes les JPA objets, ce qui pourrait ne pas être une solution appropriée dans tous les cas, si vous avez d'autres objets que vous avez l'intention de rester connecté.entityManager.detach(entity);
Supprimer l'entité à partir du contexte de persistanceOriginalL'auteur Xstian