estou a desenvolver uma aplicação web com 3 camadas onde existe concorrência de acesso aos dados.
O que quero é aplicar a estratégia Optimistic lock fornecida pelo Hibernate para conservar a coorencia da base de dados. Como tb uso o Spring estou um pouco confuso como devo implementar a solução porque todos os exemplos que vi ate agora partem do principio que so existe o Hibernate…
A minha classe DAO extende a classe HibernateDAOSupport, o SessionFactory está configurado no aplicationContext.xml do Spring como bean.
Quando quero, por exemplo guardar um registo faço apenas this.getHibernateTemplate.save(Obejcto obj). Nos exemplos que vi abrem uma session e transaction… Como faço neste caso?
Obrigado pela ajuda.
Se conhecerem um bom exemplo que possa consultar agradecia.
O lock otimista é feito usando a anotação version do hibernate, fica transparente para ti. Basta declarar um atributo int com a anotação @version e o resto fica por conta do hibernate.
cecaldas obrigado pela atenção.
Eu nao estou a usar o annotations mas sim ficheiros de mapeamento XXX.hbm.xml.
Vai dar ao mesmo. Eu mapeei a propriedade version nesse ficheiro.
O esquisito é que inicialmente o version toma o valor 0 e quando eu faço o primeiro update passa a ser igual a 1. Até aqui tudo bem.
Mas se eu fizer mais um update nesse registo (2 updates no mesmo registo) o programa falha… o version deveria tomar o valor 2 mas isso não acontece.
Não consigo perceber porque acontece isto.
O erro é este
[AbstractFlushingEventListener] Could not synchronize database state with session
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.ht.model.Pcb#1]
Como tu recuperas esse objeto? Quando tu recuperas esse objeto o versão vem setado? A idéia é recuperar o objeto com o versão, quando devolveres para o banco o hibernate checa o valor do versão, isso fica transparente.