Erro ao inserir registros no hibernate[RESOLVIDO]

4 respostas
L

O problema é o seguinte…
Estou rodando um sistema cliente em duas máquinas…Estou usando Hibernate
quando abro a tela de clientes , por exemplo para inserir um novo cliente, nas duas máquinas e deixo um tempo sem mexer…depois salvo os clientes nas duas máquinas , num deles dá erro de inserção, lendo os logs de erros percebi que na máquina que deu o erro, ela está tentando inserir o novo cliente com o mesmo código da outra máquina… se na máquina 1 inseriu um cliente com o código 33, na máquina 2 que deveria inserir o cliente com o código 34 está dando um insert com o código 33 também…
o código do dao é esse

public boolean incluir(Object obj) {
        boolean retorno = true;
        Session sessao = sessionFactory.openSession();;
        sessao.beginTransaction();
        try {


            sessao.save(obj);
            sessao.getTransaction().commit();
            mensagem = ResourceBundle.getMensagem("msg.persistencia-001");


        } catch (Exception ex) {
            sessao.getTransaction().rollback();
            mensagem = TrataException.trataException(ex);
            retorno = false;
        } finally {
            sessao.close();
        }


        return retorno;
    }

Será um problema de sincronização com o banco de dados?

4 Respostas

L

será que no xml do cliente que está como increment não deveria estar como sequence? no código

<id column="CDCLIENTE" length="10" name="cdCliente" type="java.lang.Integer">
      <generator class="increment"/>
    </id>
C

incremento e uma sequencia … tente usar synchronized no seu metodo mas axo q naum e ae o problema, pq esta trabalhando com sessao…

L

eu olhei lá nas tabelas do banco e o campo CDCLIENTE não está como serial, está como inteiro e como primary key… será que quando eu seto como incremento, ele não gera no banco o campo como serial e sim como um inteiro comum e faz o incremento antes de enviar os dados para o banco?

L

Problema resolvido…
Mudei o xml das tabelas do hibernate…
no campo id mudei para sequence onde estava increment e nomeei as sequences

<generator class="increment"/>

para

<generator class="increment">
<param name="sequence">cliente_seq</param>
<\generator>

assim cada vez ele dá um nexVal na sequence para gerar o id dos clientes
com o increment ele sempre dava um select max( cdCliente)…dessa forma quando dois pcs cadastravam ao mesmo tempo um cliente, um deles que se atrasava um pouco para processar tentava salvar o novo cliente com o mesmo código do anterior, assim dava erro

Criado 4 de agosto de 2010
Ultima resposta 5 de ago. de 2010
Respostas 4
Participantes 2