[RESOLVIDO] - Problemas com transação no Hibernate

1 resposta
paulofafism

Pessoal estou tendo um seguinte problemas de transação no hibernate
Primeiramente vejam meu arquivo de configuração

<hibernate-configuration>
	<session-factory>
               <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
               <property name="dialect">org.hibernate.dialect.SQLServerDialect </property>               
               <property name="hibernate.cache.use_second_level_cache">true</property>
               <property name="hibernate.connection.isolation=2">true</property>
               <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>  
               <property name="hibernate.cache.use_query_cache">true</property>                                     
                
	       <!-- Configurações de debug -->
	       <property name="show_sql">true</property>
               <property name="use_outer_join">true</property>	
               <property name="hibernate.generate_statistics">true</property>
               <property name="hibernate.use_sql_comments">true</property> 	                
                
               <!-- Classes mapeadas -->                                          
               <mapping class="oberon.dominio.Cliente"/>                
              <!-- <mapping class="oberon.dominio.TelefoneCliente"/>                      
               <mapping class="oberon.dominio.ReferenciaCliente"/>     -->                                 
               <mapping class="oberon.dominio.Pais"/>    
               <mapping class="oberon.dominio.Cidade"/>    
               <mapping class="oberon.dominio.Estado"/>                   
               <mapping class="oberon.dominio.Bairro"/>                    
               <mapping class="oberon.dominio.Endereco"/>                  
               <mapping class="oberon.dominio.TipoLogradouro"/>
               
               <!-- Classes mapeadas Contabilidade-->
               <mapping class="oberon.dominio.contabilidade.HistoricoPadrao"/>              
               <mapping class="oberon.dominio.contabilidade.Situacao"/>                                                                        
	</session-factory>
</hibernate-configuration>

Nesta propriedade estou definindo como nivel de isolação ReadCommited

A Aplicação esta funcionando perfeitamente, fazendo consultas, cadastrando, alterando perfeitamente,

O problema ocorre quando a dois usuários acessando o sistema
O Usuário 1 acessa o sistema a tabela de clientes e consulta o CLIENTE 1 para fazer alterações MAIS ainda não comitou as alterações

O Usuário 2 acessa o sistema E TB TABELA DE CLIENTES e consulta o CLIENTE 1 para fazer alterações

Logo em seguida o Usuario 1 comita as alterações salvou no banco ate ai tudo bem

Agora quando o USUARIO 2 comita tb as alterações do CLIENTE 01 o hibernate simplesmente salva o registro sem lançar nenhuma exeção.

O Correto seria se estou usando o nivel de isolamente READ COMMITED ele teria que lançar uma execeção na transação do USUARIO 2.

Por que isso não acontece? Alguém já passou por isso

1 Resposta

paulofafism

Resolvi o problema da seguinte anotei minha classe com a anotação org.hibernate.annotations.Entity e criei um atributo que indica a versão do registro no banco de dados anotando esse atributo com a anotação @Version
Com isso consigue fazer um Lock otimista. Ou seja quando o Usuario 1 estiver editando um registro e o usuario 2 tb estiver editando o mesmo registro que o USUARIO 1 estiver editando e o logo em seguida Usuário 1 Comita os dados primeiro, uma execeção e lançada para o usuário 2 indicando que o registro foi alterado por outro usuário caso ele comite os dados tb

@javax.persistence.Entity
@org.hibernate.annotations.Entity(optimisticLock = org.hibernate.annotations.OptimisticLockType.ALL, 
                dynamicUpdate = true)  
@Table(name = "BAIRRO")
//@javax.persistence.SequenceGenerator(
    //        name="CODBAIRRO_GEN", sequenceName="CODBAIRRO_GEN", allocationSize=1)
public class Bairro extends AbstractPersistentObject implements Serializable, Cloneable{


      @Version
     @Column(name = "VERSION")
     @Temporal(TemporalType.TIMESTAMP)
     private java.util.Date recVersion;    
    
    public void setRecVersion(java.util.Date version){
        this.recVersion = version;
    }
    
    public java.util.Date getRecVersion(){
        return this.recVersion;
    }

}
Criado 8 de novembro de 2008
Ultima resposta 8 de nov. de 2008
Respostas 1
Participantes 1