Je rassemblais des informations sur la méthode flush (), mais je ne sais pas très bien quand l'utiliser et comment l'utiliser correctement. D'après ce que j'ai lu, je crois comprendre que le contenu du contexte de persistance sera synchronisé avec la base de données, c'est-à-dire en émettant des déclarations en suspens ou en actualisant les données d'entité.
Maintenant, j'ai le scénario suivant avec deux entités A
et B
(dans une relation un-à-un, mais non appliquée ou modélisée par JPA). A
a un PK composite, qui est défini manuellement, et a également un champ IDENTITY généré automatiquement recordId
. Cela recordId
doit être écrit dans l'entité en B
tant que clé étrangère de A
. J'économise A
et B
en une seule transaction. Le problème est que la valeur générée automatiquement A.recordId
ne sont pas disponibles dans la transaction, à moins que je fais un appel explicite em.flush()
après avoir appelé em.persist()
le A
. (Si j'ai un IDENTITY PK généré automatiquement, la valeur est directement mise à jour dans l'entité, mais ce n'est pas le cas ici.)
Peut-il em.flush()
causer des dommages lors de son utilisation dans une transaction?
la source
En fait,
em.flush()
faites plus que simplement envoyer les commandes SQL mises en cache. Il essaie de synchroniser le contexte de persistance avec la base de données sous-jacente. Cela peut entraîner une consommation de temps importante sur vos processus si votre cache contient des collections à synchroniser.Attention à l'utiliser.
la source
Oui, il peut contenir des verrous dans la base de données pendant une durée plus longue que nécessaire.
Généralement, lorsque vous utilisez JPA, vous déléguez la gestion des transactions au conteneur (alias CMT - en utilisant l'annotation @Transactional sur les méthodes commerciales), ce qui signifie qu'une transaction est automatiquement lancée lors de la saisie de la méthode et validée / annulée à la fin. Si vous laissez EntityManager gérer la synchronisation de la base de données, l'exécution des instructions SQL ne sera déclenchée que juste avant la validation, entraînant des verrous de courte durée dans la base de données. Sinon, vos opérations d'écriture vidées manuellement peuvent conserver des verrous entre le vidage manuel et la validation automatique qui peuvent être longs en fonction du temps d'exécution de la méthode restant.
Note qu'une opération déclenche automatiquement un vidage: exécution d'une requête native sur la même session (l'état EM doit être vidangé pour être accessible par la requête SQL), insertion d'entités à l'aide de l'ID généré natif (généré par la base de données, l'instruction d'insertion doit donc être déclenché ainsi l'EM est capable de récupérer l'id généré et de gérer correctement les relations)
la source