1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Erro de unique constraint ao salvar com hibernate

Bom dia.

Possuo um objeto Classe com uma lista de Alunos. O objeto Aluno possui uma propriedade String nomeada status.

O algoritmo precisa atualizar essa lista de alunos com base em uma lista obtida em uma consulta externa. O valor default para status é "".

Exemplicando: Digamos que minha classe tem o aluno Fulano com status "". A lista a ser usada na comparação tem o aluno Fulano 2 vezes, uma com o status "" e outra com o status "Transf".

O que ocorre nesse caso de uso é que o aluno Fulano estava matriculado na classe, indicado pelo status "". Em seguida o aluno foi transferido, caso em que o status do aluno é atualizado para "Transf". Posteriormente o aluno Fulano volta para a mesma classe. Nesse caso não posso atualizad "Transf" para "". Então é criado um novo Fulano com status "". Sei que parece estranho, mas essas são as regras da base que devo reproduzir.

Então ao fazer a sincronia entre o BD local e a lista obtida pela consulta ocorre o seguinte: 1. O algoritmo pega o elemento Fulano "Transf" na lista remota e verifica sua existencia na lista local. 2. Não encontra, verifica então a existência de Fulano "". Desta vez encontra, então atualiza o status para "Transf" 3. O algoritmo pega agora o Fulano "" da lista remota e verifica sua existência na lista local. Não encontrará pois já foi atualizado. 3. O algoritmo cria então o Fulano "".

Concentrando no Fulano a situação é a seguinte.

Antes da atualização: ID Nome Status 05 Fulano ""

Depois da atualização: ID Nome Status 05 Fulano "Transf" null Fulano ""

A constraint unique no Banco é (Nome, Status). Ao tentar salvar dá o erro dizendo já existir um Fulano "". O problema é que o objeto Fulano "" foi atualizado para Fulano "Transf", então eu deveria conseguir criar um novo objeto Fulano "".

O problema ocorre ao salvar a Classe que contém a lista de alunos. Parece que o Hibernate não consegue identificar que o Fulano "" com ID 05 foi atualizado para Fulano "Transf" e então não deixa criar o novo Fulano "".

Já estou considerando salvar os alunos individualmente a cada iteração do sincronismo, mas antes gostaria de saber se alguém já passou por problema similar e se conhecem alguma solução mais elegante.

Att Sergio

@peczenyj Olá. Já havia considerado isso, mas você me deu uma ideia. Eu simplifiquei um pouco a explicação. No caso mais detalhado existem três objetos. Classe, Aluno e o AlunoClasse sendo que a classe possui uma lista de AlunoClasse e o Status está em AlunoClasse. Tive um problema similar quando criava um novo aluno. Ao salvar a Classe dava erro. Era preciso salvar o Aluno antes.

Pela abordagem que você sugere, vou testar, eu precisaria explicitamente salvar o AlunoClasse a cada alteração. Porém nessa abordagem não ficaria redundante salvar a Classe depois? Uma vez que estou alterando dados apenas no AlunoClasse.

A princípio eu imaginava que salvando a Classe o Hibernate cuidaria de salvar também a lista de AlunoClasse, o que realmente ocorre na maioria dos casos. Esse caso específico que fica dando o erro de constraint. Imaginava se existiria algum relacionamento para resolver.

Testarei essa abordagem e colocarei resultado aqui...

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags hibernate java banco-de-dados ou faça a sua própria pergunta.