Bloqueio otimista em um aplicativo RESTful
No trabalho, estamos desenvolvendo um aplicativo RESTful em que a camada de dados será tratada pelo Hibernate. Mas não temos certeza de como lidar com atualizações de entidades.
Planejamos fazer o seguinte:
1) o cliente solicita uma entidade por ID
2) O Hibernate carrega a entidade, os campos solicitados (sempre com a versão) são copiados para um DTO que é convertido em JSON e enviado ao cliente
3) O cliente gerencia alguns campos e envia a entidade (com número da versão) de volta ao servidor.
4) O servidor recebe o JSON que é convertido em um DTO.
5) A entidade correspondente é carregada do Hibernate e os objetos do DTO são copiados para a entidade.
=> A entidade sempre é substituída, mesmo que o número da versão do cliente tenha sido definido. Isso significa que sempre precisamos verificar o número da versão do cliente em relação ao número da versão da instância carregada por nós mesmos, em vez de o Hibernate fazer isso?
Em um aplicativo regular com sessões, a instância desanexada é salva no HttpSession. Sempre que o cliente atualiza a entidade, a instância é recuperada do HttpSession e alguns atributos são atualizados. Sempre que o Hibernate confirmar a atualização, uma ObjectStaleException será lançada se o número da versão for <o número da versão atual.
O problema aqui é que não temos nenhuma sessão Http porque estamos tentando ser RESTful.
Existe uma solução genérica para lidar com o bloqueio otimista em aplicativos RESTful em vez de verificar os números de versão por nós mesmos?