Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Entity Listenner, quando usar?

Boa noite,

Gostaria de saber se quando tenho que atualizar uma entidade e isso pode resultar em atualizações em outras entidades que não tem relacionamento entre elas, é uma boa usar Entity Listenners para que no callback do Hibernate isso ocorra. Ex: Mudança de preço de um Produto, tivesse que atualizar tabelas como balanco_financeiro entre outras.

Se isso fosse feito apenas em um fluxo, poderia ter uma camada de serviço que fizesse isso, mas e se quisesse garantir que independente do fluxo, uma vez que mexeram na entidade Produto (@PostUpdate) automaticamente outras tabelas fossem também atualizadas dentro da mesma transação. Seria uma boa?

3 respostas

Olá Felipe,

De acordo com a especificação da JPA 2 (JSR 317), não podemos alterar qualquer estado de uma entidade que esteja envolvida em um relacionamento e também não podemos acessar o EntityManager para manipular essa ou outra entidade. Isso se dá porque fazer alguma dessas operações pode interferir na operação que está sendo realizada no momento em que o callback é invocado.

Nesse caso, o ideal seria mesmo incluir as alterações que você planeja realizar nas outras entidades na própria lógica do seu sistema. Por exemplo, na lógica onde você altera o preço você precisaria ter o código que busca outras entidades afetadas por essa mudança e fazer os ajustes necessários.

E aí Jeferson , blz?

Pelo que entendi esse tipo se situação seria resolvido com uma classe de serviço que estaria fazendo as alterações necessárias dentro de uma transação, ou então usar @Observers do CDI para uma determinada entidade, e aí o(s) observer(s) poderiam atualizar essas outra(s) entidades. Seria isso?

Outro ponto é em que situações esse callbacks do jpa/hibernate seriam úteis? Não consigo ver muita utilidade neles.

solução!

Olá Felipe,

Pois é, da forma como ficou definido na especificação, o uso desse recurso fica mesmo bastante restrito. Geralmente, esse recurso é utilizado para fazer alterações pontuais como atualizar a data da última alteração de uma entidade ou então para sempre criptografar algum campo antes de salvar. De resto tem que considerar na própria lógica do sistema mesmo.