[RESOLVIDO] Hibernate executa sqls fora de ordem

3 respostas
L

Olá amigos,

Tenho uma classe Prioridade que entre outras coisas tem o atributo ordem que deve ser único. Então quando quero adicionar uma nova prioridade no meio das que já estão salvas, abro o espaço fazendo os updates para depois inserir.
@Column(name="ORDEM",nullable=true,unique=true)
    private Integer ordem = null;

    public void inserirNova(Session session) {
        for (Prioridade p : (List<Prioridade>)session.createCriteria(Prioridade.class).list())
            if (p.getOrdem() >= ordem){
                p.setOrdem(p.getOrdem()+1);
                session.update(p);
            }
        session.save(this);
    }
Esse codigo está dando errado pois no save ele da exceção de que o atributo ordem nao é unico e ao observar o sql gerado notei que o hibernate está fazendo o insert antes dos updates (???). Como solução temporária tirei o unique=true para que o codigo funcione, mas corre o risco de ter inconsistencia de dados (prioridades de mesma ordem). Alguem sabe por que o hibernate está executando minhas operações fora da ordem que estabeleci ? (Obs: a transação é aberta antes da chamada do metodo inserirNova() e comitada logo apos o retorno) Muito Obrigado!

3 Respostas

R

De fato, o Hibernate pode reordenar operações de BD por questões de otimização. Para garantir que seus UPDATE’s sejam confirmados antes do INSERT, use session.flush() antes de session.save(this).

ivandasilva

Fiquei com uma dúvida, se você tem as prioridades [3,4,5] e a ordem 4, na segunda iteração do for each ele vai duplicar o número 5, e isso vai arrebentar com a sua constraint unique…

L

roger_rf, valeu! Isso resolveu o problema da ordem de execução das sqls, mas agora apareceu o problema que o ivandasilva antecipou, he he…
Nao tinha me atentado a isso msm pq o teste nunca tinha chegado nessa parte, soh preciso agora atualizar as ordens de tras pra frente, valeu ivan !

Criado 3 de março de 2011
Ultima resposta 3 de mar. de 2011
Respostas 3
Participantes 3