Optmistic Lock: Hibernate e Spring

Pessoal,

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.

Abraço

Vá lá pessoal.
Tenho a certeza que me podem dar umas dicas…

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.

Talvez tenha que configurar o transaction manager desta maneira

<bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor" abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default">
	<property name="transactionInterceptor">
		<ref local="txInterceptor" />
	</property>
</bean>

<bean id="txInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor" abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default">
	<property name="transactionManager">
		<ref local="transactionManager" />
	</property>

	<property name="transactionAttributeSource">
		<bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource" abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default" />
	</property>
</bean>