Oui, oui, encore un post de geek...
Bon, je me suis aperçu que Hibernate n'échappait pas les tables et les colonnes des tables. Ainsi, si on a une classe User
(pas très courant, n'est-ce pas ?), Hibernate va essayer de générer une table User
, et ça va échouer car c'est un mot-clé SQL[1]. Et c'est la même chose pour les champs.
La méthode préconisée par Hibernate est de rajouter des guillemets inversées, avec @Column
ou @Table
lorsqu'on utilise des annotations JPA.
Bon, moi je me voyais pas faire ça, alors j'ai plutôt utilisé une NamingStrategy
que vous voyez ci-dessous:
package mon.package; import org.hibernate.cfg.ImprovedNamingStrategy; public class JujuNamingStrategy extends ImprovedNamingStrategy { @Override public String columnName(String columnName) { return "`" + super.columnName(columnName) + "`"; } @Override public String tableName(String tableName) { return "`" + super.tableName(tableName) + "`"; } @Override public String classToTableName(String className) { return "`" + super.classToTableName(className) + "`"; } }
Et ça se met en oeuvre simplement dans notre fichier de configuration Spring, lorsqu'on définit les propriétés de l'EntityManagerFactory
, dans la jpaPropertyMap
qui sert à définit les propriétés spécifiques à Hibernate :
<entry key="hibernate.ejb.naming_strategy" value="mon.package.JujuNamingStrategy" />
Certes, peut-être manque-t-il certaines méthodes dans ma classe; je les ajouterai lorsque j'en aurai besoin, pour l'instant ça marche bien comme ça !
Notes
[1] Du moins avec PostgreSQL... mais on peut très bien avoir aussi un champ from
par exemple.