Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Lógica de hibernação + ON DUPLICATE KEY


O Hibernate pode lançar uma ConstraintViolationException quando você tenta inserir uma linha que quebra uma restrição (incluindo uma restrição exclusiva). Se você não obtiver essa exceção, poderá obter alguma outra exceção geral do Hibernate - depende da versão do Hibernate e da capacidade do Hibernate de mapear a exceção do MySQL para uma exceção do Hibernate na versão e tipo de banco de dados que você está usando ( Não testei em tudo).

Você só receberá a exceção depois de chamar flush() , portanto, verifique se isso também está no seu bloco try-catch.

Eu teria o cuidado de implementar soluções em que você verifica se a linha existe primeiro. Se várias sessões estiverem atualizando a tabela simultaneamente, você poderá obter uma condição de corrida. Dois processos lêem a linha quase ao mesmo tempo para ver se ela existe; ambos detectam que não está lá e, em seguida, ambos tentam criar uma nova linha. Um falhará dependendo de quem vencer a corrida.

Uma solução melhor é tentar inserir primeiro e, se falhar, assumir que já estava lá. No entanto, uma vez que você tenha uma exceção, você terá que reverter, o que limitará como você pode usar essa abordagem.