Impossible d'utiliser le tableau nommé “utilisateur” dans postgresql, hibernate
Quand j'ai essayer de persister une entité appelée "utilisateur" avec JPA/hibernate, il ne fonctionne pas. La table n'est pas créée, et c'est parce que l'utilisateur est un mot réservé dans postgresql. Est-il un moyen autre que de nommer la table quelque chose d'autre pour faire ce travail?
- Je viens de tomber sur ce, je pensais que switchign db fournisseur avec mise en veille prolongée était censé être sans problème
- Comme par stackoverflow.com/q/3364835/1266906 vous pouvez utiliser la mise en veille prolongée.globally_quoted_identifiers=true dans les versions récentes de hibernate
Vous devez vous connecter pour publier un commentaire.
Pour citer un identifiant, utiliser les tiques:
Voir cet exemple de mise en veille prolongée de la suite de tests:
https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/test/java/org/hibernate/test/quote/User.java#L31
Hibernate va automatiquement détecter et de se convertir à l'une citation appropriée pour la base de données que vous utilisez.
JPA prend en charge la syntaxe suivante pour spécifier que le nom de la table doit être utilisé exactement comme spécifié:
Essayez d'utiliser cette annotation sur votre classe d'entité et de voir si il fait le tour. Les barres obliques inverses sont utilisés pour échapper à un ensemble de doubles guillemets, de sorte qu'il ressemble un peu laid.
Je dirais que vous devriez éviter d'avoir des noms de table qui sont des mots réservés, avec mise en veille prolongée. Bien sûr, vous pouvez échapper, mais il peut provoquer des problèmes dans l'avenir (dans une requête par exemple). Donc, le meilleur moyen est le nom de la table d'une autre manière - dire
users
:PostgreSQL suit la norme ANSI pour en citant des noms d'objets, de sorte que vous devez spécifier "utilisateur", comme le nom de la table (y compris les guillemets)
Je ne sais pas comment vous dire d'hibernation pour générer une telle déclaration.
Je vous recommande fortement de trouver un autre nom pour votre table, il vous donnera plus de problèmes que ça vaut le coup.
Comme les autres ont dit,
user
est un mot réservé en SQL et Postgresql.De nombreuses bases de données ont beaucoup de mots réservés, plus d'un millier la dernière fois que j'ai compté. Il est donc très facile à exécuter dans bizarre problème dû à un mot réservé de collision.
De fuite trait de soulignement:
user_
Ici est le moyen le plus commode astuce que j'ai jamais appris de SQL: Toujours ajouter une fuite de soulignement à vos noms. Je fais cela pour les noms de table, les noms de colonnes, index des noms, et ainsi de suite.
SQL spec spécifiquement promesses† de ne jamais avoir un mot-clé ou mot réservé avec un trailing trait de soulignement. Cette promesse est étrangement inséré dans la spec sans contexte. Mais pour moi, il hurle “Ajouter le trait de soulignement à tous vos noms!”.
Après l'adoption de cette règle, j'ai découvert un agréable avantage secondaire. Quand je vois le trait de soulignement dans le code, dans les commentaires, dans le numéro de suivi, et dans les e-mails, je sais que nous pensons particulièrement à l'élément de base de données tels que
customer_
de la table par rapport à la notion de “client” ou de la catégorieCustomer
dans mon code Java.† je ne peux pas citer le SQL spec, car il est protégé par un copyright, malheureusement. Dans le SQL:2011 spec, lisez la section 5.4 Noms et identifiants sous la rubrique Règles de Syntaxe point 3, NOTE 111. Dans SQL-92 voir la section 5.2, point 11. Juste la recherche de la parole
underscore
fonctionne.