Question Avantages de object.get () vs object.read () dans Grails


Je parcourais une partie de la documentation de Grails et trouvais ce peu au sujet de la read() méthode dans Grails. Si je comprends bien, vous pouvez extraire une version "en lecture seule" d'un objet de la base de données qui ne sera sauvegardé que sur une base explicite. save() appel. Il me semble alors que vous devriez utiliser un read() appelez chaque fois que vous avez un objet dont vous ne vous attendez pas à être modifié.

Mais pourquoi ne pas toujours utiliser un read() appel? Depuis l'objet sera modifié pour lire / écrire des autorisations si vous save() de toute façon, ne serait-il pas plus sûr de simplement lire l'objet au lieu de l'obtenir?


23
2017-07-09 18:13


origine


Réponses:


Vous avez probablement raison - ce serait équivalent dans la plupart des cas. Mais Hibernate ne nécessite pas que vous appelez save() comme il effectue une vérification sale lors d'un flush et que Grails utilise un intercepteur "Open Session in View", il y aura toujours un flush à la fin de chaque requête. Cela surprend les gens qui apportent des modifications à une instance récupérée par get() qui étaient censés être seulement temporaires lors du rendu de la vue, mais les modifications sont persistées de toute façon sans save() appel. read() serait plus logique dans ce scénario.

Une optimisation des performances consiste à utiliser http://grails.org/doc/latest/ref/Database%20Mapping/dynamicUpdate.html pour ne transférer que les champs modifiés vers la base de données. La valeur par défaut est de pousser tous les champs, qu’ils soient modifiés ou non, car il n’est plus nécessaire de générer un nouveau code SQL pour chaque mise à jour. Si vous read() une instance Hibernate ne conserve pas les données d'origine, donc la mise à jour dynamique ne serait pas possible car il n'y aurait aucun moyen de savoir quels champs sont sales.


18
2017-07-09 19:46