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.