Spring Data JPA - Pourquoi changer une Entité renvoyée automatiquement persisté?
Je vous présente la question avec un exemple.
Affirmer que nous avons un Référentiel tel que ci-dessous:
public interface ExampleObjectRepository extends CrudRepository<ExampleObject, Long> {
}
Par l'extension de la JpaRepository
interface, le ExampleObject
référentiel hérite de la méthode suivante:
T findOne(ID id);
Maintenant, j'ai observé que, si je reçois une référence à un ExampleObject après un appel à cette méthode, toutes les manipulations que j'ai faites à cette méthode sont automatiquement enregistrées dans la base de données, par exemple:
ExampleObject pointInCase = exampleObjectRepository.findOne(1L);
pointInCase.setName("Something else");
De lecture autour de l'objet, je comprends ce signfies que ExampleObject
instance est not detached
.
Cela va à l'encontre de mes attentes. J'aurais pensé que j'aurais besoin d'utiliser la méthode save hérité de CrudRepository
pour enregistrer les modifications:
T save(T entity);
Quelqu'un serait-il assez aimable pour confirmer que les objets retournés par une source de Données JPA Référentiel de rester attaché en tant que norme, et d'expliquer comment utiliser l'API pour marquer une méthode dans le référentiel tel qu'il retourne uniquement détaché des références?
J'imagine que la modification de l'entité de l'etat peut également modifier sa définition lorsqu'il est utilisé avec dit save(T entity)
méthode, donc j'apprécierais aussi une compréhension de la façon dont l'identité pour les mises à jour sont gérées.
Vous devez vous connecter pour publier un commentaire.
C'est un principe fondamental de la JPA. Vous travaillez avec le joint (réussi) les entités, et à chaque modification faite sur ces entités gérées automatiquement persistante.
Si vous ne voulez pas que vos modifications soient persistants, alors ne faites pas des changements, ou d'annuler la transaction.
Travail détaché entités serait un cauchemar, car il permettrait d'éviter paresseux-le chargement de toutes les associations. Vous pouvez toujours faire appel à
EntityManager.detach()
sur vos entités, mais vraiment, je ne le ferais pas. Juste essayer de comprendre comment il fonctionne et de traiter avec elle. Il y a beaucoup plus d'avantages que d'inconvénients. L'un d'eux étant que vous n'avez même pas à réfléchir sur l'enregistrement de toutes les modifications qu'une logique complexe pourrait le faire, puisque tout est fait pour vous par JPA, de manière transparente.save
méthode est inutile à moins que vous détacher? Ou je doit appeler une autre méthode juste pour s'assurer que JPA ferme la transaction à la place de la restauration?Vous pouvez faire de votre Référentiel de retour détaché entités si votre Transaction est définie dans le référentiel. I. e. votre opération commence par l'entrée dans le référentiel et se ferme lorsque vous code quitte le référentiel.
Si vous travaillez comme cela, vous devez prendre soin que toutes les données nécessaires est chargé en une seule fois, parce que sinon, vous aurez une initialisation des exceptions. Mais dans de nombreux cas, je considère que ce souhaitable, car il vous donne un peu de contrôle, et à quel moment du chargement des données, qui, autrement, se glisse facilement à travers vos doigts lors de l'utilisation de JPA.
Pour les modifications je utiliser une autre étendue de la Transaction qui enveloppe l'ensemble du processus de chargement, la modification (et, implicitement, la persistance).
J'ai aussi été confronté au même problème.
Mais pour moi, le problème est venu sur la coutume référentiel de mise en œuvre puis j'ai ajouté @Transactionnelle(readOnly = true).