J'essaie de lancer l'hibernation sur une base de données PostgreSQL 8.4.2. Chaque fois que j'essaye de lancer un code Java simple comme:
List<User> users = service.findAllUsers();
Je reçois l'erreur suivante:
PSQLException: ERROR: relation "TABLE_NAME" does not exist
Depuis que l'option hibernate.show_sql est définie sur true, je vois que hibernate tente d'exécuter la commande SQL suivante:
select this_.USERNAME as USERNAME0_0_, this_.PASSWORD as PASSWORD0_0_
from "TABLE_NAME" this_
Quand en réalité, il devrait au moins exécuter quelque chose comme:
select this_."USERNAME" as USERNAME0_0_, this_."PASSWORD" as PASSWORD0_0_
from "SCHEMA_NAME"."TABLE_NAME" as this_
Est-ce que quelqu'un sait quelles modifications je dois apporter à Hibernate pour produire le bon code SQL pour PostgreSQL?
J'ai configuré la source de données postgreSQL nécessaire dans le fichier applicationContext.xml:
<!-- Use Spring annotations -->
<context:annotation-config />
<!-- postgreSQL datasource -->
<bean id="dataSource" class="org.Apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="org.postgresql.Driver" />
<property name="url"
value="jdbc:postgresql://localhost/DB_NAME:5432/SCHEMA_NAME" />
<property name="username" value="postgres" />
<property name="password" value="password" />
<property name="defaultAutoCommit" value="false" />
</bean>
Sur le même fichier, j'ai configuré la fabrique de sessions avec le dialecte PostgreSQL:
<!-- Hibernate session factory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="annotatedClasses">
<list>
<value>com.myPackage.dbEntities.domain.User</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<!-- setup transaction manager -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
Enfin, la façon dont je mappe la classe de domaine sur la table est la suivante:
@Entity
@Table(name = "`TABLE_NAME`")
public class User {
@Id
@Column(name = "USERNAME")
private String username;
Quelqu'un at-il rencontré une erreur similaire?. Toute aide pour résoudre ce problème sera grandement appréciée. Veuillez noter que la question est différente de post Impossible d'utiliser simplement le nom de la table PostgreSQL («la relation n'existe pas»)
Toutes mes excuses pour le long post.
Vous devez spécifier le nom du schéma dans les propriétés Hibernate de Spring, et non dans l'URL de connexion JDBC:
<prop key="hibernate.default_schema">SCHEMA_NAME</prop>
Cela dit, votre URL de connexion JDBC est en fait syntaxiquement invalide. Selon la Documentation JDBC de PostgreSQL vous devez utiliser l'une des syntaxes suivantes:
jdbc:postgresql:database
jdbc:postgresql://Host/database
jdbc:postgresql://Host:port/database
La database
est ici le nom de la base de données. Si l'hôte est laissé, sa valeur par défaut sera localhost
. Si le numéro de port n'est pas renseigné, la valeur par défaut sera simplement 5432
. Ainsi, l’un des éléments suivants est valable dans votre cas:
jdbc:postgresql:DB_NAME
jdbc:postgresql://localhost/DB_NAME
jdbc:postgresql://localhost:5432/DB_NAME
La documentation du pilote JDBC de PostgreSQL ne semble pas vous aider à ajouter le schéma à la fin de l’URL de connexion. Êtes-vous sûr que cela est censé fonctionner?
Une solution de contournement consisterait à définir search_path dans la base de données pour inclure votre schéma, mais cela échouerait évidemment si vous avez la même table dans plusieurs schémas.
Je ne connais pas assez d'hibernation pour pouvoir dire s'il est possible de lui apprendre un schéma.