Hibernate-reactive: Amélioration - Intégration avec l'annotation spring @Transactional

Créé le 20 mai 2021  ·  16Commentaires  ·  Source: hibernate/hibernate-reactive

Salut,

nous sommes sur l'évaluation en cours d'hibernate réactive pour remplacer notre logiciel actuel composé de postgres-db + spring boot + spring data + r2dbc. Nous avons fait face à de nombreuses limitations en utilisant r2dbc et nous voulions réutiliser les vastes connaissances que nous avons déjà autour d'Hibernate.
Nous avons presque refactorisé un micro-service complet, réécrit nos propres données de printemps (référentiel générique) et ça a l'air vraiment bien.

L'un des principaux problèmes soulevés par les développeurs concerne l'option d'utiliser la gestion déclarative des transactions (à l'aide d'annotations) au lieu de la programmation.

Nous savons que ce n'est pas le but d'Hibernate réactif d'implémenter un tel mécanisme, mais aux frameworks (Spring, Quarkus...) qui s'intègre à Hibernate, comme cela a été fait pour l'Hibernate standard. Même si nous voulons le faire nous-mêmes, l'API de transaction dans Hibernate réactive n'est pas la même que l'API Hibernate standard et il n'y a pas d'API pour interagir avec le gestionnaire de transactions.

Je serai heureux si nous pouvons obtenir vos commentaires à ce sujet (et encore plus si vous le pouvez :smiley:), et si vous pensez toujours que nous pouvons le faire pour proposer les directives générales car nous n'avons actuellement aucune idée de comment le faire.
Merci

problem

Tous les 16 commentaires

Eh bien, je suppose que Spring a une sorte de concept d'intercepteur où vous pouvez utiliser des annotations pour lier un intercepteur à un appel de méthode de bean. Si vous appelez withTransaction() depuis un intercepteur comme celui-ci, puis déléguez à la méthode du bean, c'est tout ce qu'est la gestion déclarative des transactions. En réalité, il ne devrait s'agir que de quelques lignes de code. (Au moins ce serait en CDI, je suis moins sûr pour le printemps.)

La seule subtilité est que vous avez besoin d'un moyen de détecter s'il existe une transaction déjà liée au flux réactif actuel. Dans notre pile, cela se ferait à l'aide de MP Contexts. Aucune idée de comment cela se passe à Spring Land.

(OTOH si vous demandez comment intégrer un gestionnaire de transactions XA, eh bien, c'est une toute autre boîte de vers, et ce n'est pas vraiment pratique avec le pilote réactif en ce moment. Nous n'avons pas encore de transaction vraiment réactive gérants.)

À l'heure actuelle, nous n'avons pas besoin de transaction distribuée

Ensuite, un intercepteur qui appelle SessionFactory.withTransaction() devrait fonctionner correctement.

Je vais essayer de cette façon et mettre à jour. Merci

@gavinking il semble que Spring implémente le @Transactional en utilisant Aspect. Ce n'est pas vraiment si important, mais c'est peut-être aussi plus simple à mettre en œuvre pour nous.
Mais je pense que nous ne pouvons pas le faire uniquement si vous exposez une API pour openTransaction() commitTransaction() et rollbackTransaction() dans la classe Stage, car nous avons une API openSession() et closeSession(). Je pense que l'objet de transaction est nécessaire et que withTransaction n'est pas suffisant.
Est-ce que ça fait du sens ?

Il devrait y avoir une sorte de notion d'intercepteur "autour" qui vous permet de boucler et de transmettre à la méthode.

(Il est vrai que vous ne pouvez pas le faire avec des intercepteurs avant/après.)

@gavinking pouvez-vous s'il vous plaît élaborer sur ce que vous avez écrit avant "Dans notre pile, cela serait fait en utilisant MP Contexts." vérifier si une transaction est déjà liée dans le flux actuel ? Pouvez-vous vous référer au code ou aux tests qui ont été écrits. Idem pour la session, comment puis-je comprendre qu'une session est déjà ouverte dans le flux actuel.
Merci.

Écoute, je n'ai aucune idée de comment tu fais ça au printemps. Vous avez besoin d'une sorte de construction qui ressemble un peu à un thread local, mais un local lié au flux réactif actuel au lieu du thread. Je suis sûr qu'ils doivent avoir quelque chose.

Je ne vais pas utiliser spring @Transactional pour le moment, mais implémenter notre propre annotation transactionnelle pour éviter d'aller trop loin dans Spring. Ma question précédente était donc liée à votre phrase "Dans notre pile, cela se ferait à l'aide de MP Contexts".

"notre pile" == Quarkus.

Je dis que vous devez trouver quelque chose de similaire dans l'environnement Spring.

Parce que si vous ne pouvez pas lier une valeur au flux réactif actuel, alors vous ne pouvez pas avoir de transactions déclaratives, aussi simples que cela, et vous n'aurez qu'à gérer les transactions "manuellement". (Ce qui est en fait super simple en appelant simplement withTransaction() . Je ne comprends vraiment pas pourquoi les gens pensent qu'ils ont besoin d'une annotation pour cela.)

Mais je suis sûr qu'il doit y avoir un moyen de le faire. Vous demandez simplement à la mauvaise personne.

Clôture : remplacé par #782.

@yaakov-berkovitch avec les trucs que je mets en place avec # 779, il devrait être encore plus facile pour vous de mettre cela en œuvre.

@gavinking Merci !!

Cette page vous a été utile?
0 / 5 - 0 notes