Mysql
 sql >> Base de données >  >> RDS >> Mysql

Logique Hibernate + ON DUPLICATE KEY

Hibernate peut lever une ConstraintViolationException lorsque vous tentez d'insérer une ligne qui rompt une contrainte (y compris une contrainte d'unicité). Si vous n'obtenez pas cette exception, vous pouvez obtenir une autre exception Hibernate générale - cela dépend de la version d'Hibernate et de la capacité d'Hibernate à mapper l'exception MySQL à une exception Hibernate dans la version et le type de base de données que vous utilisez ( Je ne l'ai pas testé sur tout).

Vous n'obtiendrez l'exception qu'après avoir appelé flush() , vous devez donc vous assurer que cela se trouve également dans votre bloc try-catch.

Je ferais attention à la mise en œuvre de solutions où vous vérifiez que la ligne existe en premier. Si plusieurs sessions mettent à jour la table simultanément, vous pourriez obtenir une condition de concurrence. Deux processus lisent la ligne presque en même temps pour voir si elle existe ; ils détectent tous les deux qu'il n'y en a pas, puis ils essaient tous les deux de créer une nouvelle ligne. L'un échouera en fonction du vainqueur de la course.

Une meilleure solution consiste à essayer d'abord l'insertion et si elle échoue, supposez qu'elle était déjà là. Cependant, une fois que vous avez une exception, vous devrez revenir en arrière, ce qui limitera la façon dont vous pouvez utiliser cette approche.