Hibernate-reactive: Aprimoramento - Integração com a anotação spring @Transactional

Criado em 20 mai. 2021  ·  16Comentários  ·  Fonte: hibernate/hibernate-reactive

Oi,

estamos em avaliação contínua do hibernate reactive para substituir nosso software de software atual composto por postgres-db+spring boot+spring data+r2dbc. Enfrentamos muitas limitações usando r2dbc e queríamos reutilizar o grande conhecimento que já temos sobre o Hibernate.
Quase refatoramos um micro-serviço completo, reescrevemos nosso próprio spring-data (repositório genérico) e ficou muito bom.

Um dos principais problemas que os desenvolvedores estão levantando é a opção de usar o gerenciamento de transações declarativo (usando anotação) em vez de programático.

Sabemos que não é objetivo do Hibernate reactive implementar tal mecanismo, mas sim aos frameworks (Spring, Quarkus...) que integram com o Hibernate, como foi feito para o Hibernate padrão. Mesmo que queiramos fazer isso sozinhos, a API de transação no Hibernate reactive não é a mesma que a API padrão do Hibernate e não há API para interagir com o gerenciador de transações.

Ficarei feliz se pudermos obter seus comentários sobre isso (e ainda mais se puder :smiley:), e se você ainda acha que podemos fazê-lo para propor as diretrizes gerais, porque atualmente não temos ideia de como fazê-lo.
Obrigado

problem

Todos 16 comentários

Bem, suponho que o Spring tenha algum tipo de conceito de interceptor onde você possa usar anotações para vincular um interceptor a uma chamada de método bean. Se você chamar withTransaction() de dentro de um interceptor como esse e, em seguida, delegar ao método bean, isso é tudo que o gerenciamento de transações declarativo é. Realmente deve ser apenas algumas linhas de código. (Pelo menos seria em CDI, tenho menos certeza sobre a primavera.)

A única sutileza é que você precisa de uma maneira de detectar se há uma transação já vinculada ao fluxo reativo atual. Em nossa pilha isso seria feito usando MP Contexts. Não faço ideia de como isso é feito na terra da Primavera.

(OTOH, se você está perguntando sobre como integrar com um gerenciador de transações XA, bem, isso é uma lata de worms totalmente diferente e não é realmente prático com o driver reativo no momento. Ainda não temos nenhuma transação realmente reativa gerentes.)

No momento, não precisamos de transações distribuídas

Então um interceptor que chama SessionFactory.withTransaction() deve funcionar bem.

Vou tentar desta forma e atualizar. obrigado

@gavinking parece que o Spring implementa o @Transactional usando o Aspect. Não é realmente tão importante, mas também pode ser mais simples para nós implementarmos.
Mas acho que não podemos fazer isso apenas se você expor uma API para openTransaction() commitTransaction() e rollbackTransaction() na classe Stage, pois temos uma API openSession() e closeSession(). Acho que o objeto de transação é necessário, e o withTransaction não é suficiente.
Isso faz sentido ?

Deve haver algum tipo de noção de um interceptor "ao redor" que permite que você envolva e encaminhe para o método.

(É verdade que você não pode fazer isso com interceptores antes/depois.)

@gavinking , você pode elaborar sobre o que escreveu antes "Em nossa pilha, isso seria feito usando MP Contexts". verificar se uma transação já está vinculada no fluxo atual? Você pode se referir ao código ou testes que foram escritos. O mesmo para a sessão, como posso entender que uma sessão já está aberta no fluxo atual.
Obrigado.

Olha, eu não tenho ideia de como você faz isso na primavera. Você precisa de algum tipo de construção que seja como um threadlocal, mas um local vinculado ao fluxo reativo atual em vez do thread. Tenho certeza que eles devem ter algo.

Atualmente, não vou usar spring @Transactional, mas implementar nossa própria anotação transacional para evitar aprofundar muito o Spring. Então, minha pergunta anterior estava relacionada à sua frase "Em nossa pilha, isso seria feito usando MP Contexts".

"nossa pilha" == Quarkus.

Estou dizendo que você precisa encontrar algo semelhante no ambiente Spring.

Porque se você não puder vincular um valor ao fluxo reativo atual, não poderá ter transações declarativas, simples assim, e terá que gerenciar as transações "manualmente". (O que na verdade é supersimples apenas chamando withTransaction() . Eu realmente não entendo por que as pessoas pensam que precisam de uma anotação para isso.)

Mas tenho certeza que deve haver alguma maneira de fazer isso. Você só está perguntando para a pessoa errada.

Fechamento: substituído por #782.

@yaakov-berkovitch com as coisas que estou colocando em prática com o #779, deve ser ainda mais fácil para você implementar isso.

@gavinking Obrigado!!

Esta página foi útil?
0 / 5 - 0 avaliações