Superclasse abstraite polymorphe @GeneratedValue sur MySQL
Dans une application Spring MVC utilisant Hibernate et MySQL, vous pouvez rencontrer des problèmes lors de l'utilisation de @GeneratedValue sur une superclasse abstraite avec des sous-classes qui l'étendent. Voici un examen plus approfondi du problème et une solution.
Problème
Lors de l'enregistrement des sous-classes de la superclasse abstraite BaseEntity dans MySQL, vous pouvez recevoir une erreur concernant le non- existence de la table hibernate_sequences. Cela se produit car MySQL ne prend pas en charge les séquences et GenerationType.TABLE (la valeur par défaut de @GeneratedValue) nécessite l'utilisation d'une séquence.
Solution
Pour surmonter ce problème problème, vous devez créer une table appelée hibernate_sequences dans MySQL, comme suggéré par JBNizet dans la deuxième modification de la question d'origine. Cependant, même après avoir créé la table, vous pourriez rencontrer une autre erreur : "Colonne inconnue 'sequence_name' dans 'where clause'".
Pour résoudre ce problème, modifiez l'instruction SELECT générée par Hibernate pour spécifier correctement le nom de la séquence :
Hibernate: select sequence_next_hi_value from hibernate_sequences where sequence_name = 'BaseEntity' for update
Modifiez l'instruction par :
Hibernate: select sequence_next_hi_value from hibernate_sequences where sequence_names = 'BASE_ENTITY' for update
Assurez-vous que le nom de la séquence est en majuscule dans l'instruction SELECT, ce qui doit correspondre au nom de séquence que vous avez spécifié lors de la création de la table (instruction create table ...).
Une fois le nom de séquence correct, Hibernate SQL devrait fonctionner de manière transparente, vous permettant d'enregistrer les sous-classes de BaseEntity sans rencontrer "Inconnu erreurs de la colonne 'sequence_name'".
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!