PSQLException: erreur: la relation "nom de la TABLE" n'existe pas

j'essaie d'effectuer l'hibernation sur un PostgreSQL 8.4.2 DB. Chaque fois que j'essaie d'exécuter un code java simple comme:

List<User> users = service.findAllUsers();

j'obtiens l'erreur suivante:

PSQLException: ERROR: relation "TABLE_NAME" does not exist

puisque j'ai l'option d'hiberner.l'option show_sql définie à true, je peux voir que hibernate essaye d'exécuter la commande SQL suivante:

    select this_.USERNAME as USERNAME0_0_, this_.PASSWORD as PASSWORD0_0_ 
from "TABLE_NAME" this_

alors qu'en réalité, il devrait au moins faire 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 quels changements je dois faire pour produire le bon SQL pour PostgreSQL?

j'ai mis en place la source de données postgreSQL nécessaire dans applicationContext.fichier 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 session factory 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 à la table est:

    @Entity
@Table(name = "`TABLE_NAME`")
public class User {
@Id
@Column(name = "USERNAME")
private String username;

quelqu'un A rencontré une erreur similaire?. Toute aide dans la résolution de cette question sera très appréciée. Veuillez noter que la question est différente pour post ne peut pas utiliser simplement le nom de la table PostgreSQL ("relation does not exist")

mes excuses pour le long post.

18
demandé sur Community 2010-01-09 19:56:46

2 réponses

vous devez spécifier le nom du schéma dans les propriétés D'hibernation du ressort, pas 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 l' PostgreSQL JDBC documentation vous devez utiliser l'une des syntaxes suivantes:

  • jdbc:postgresql:database
  • jdbc:postgresql://host/database
  • jdbc:postgresql://host:port/database

database est ici le nom de la base de données. Si l'hôte est laissé à l'écart, il sera par défaut à localhost. Si le numéro de port est laissé de côté, il sera par défaut à 5432. Ainsi, l'un des éléments suivants est valide dans votre cas:

  • jdbc:postgresql:DB_NAME
  • jdbc:postgresql://localhost/DB_NAME
  • jdbc:postgresql://localhost:5432/DB_NAME
20
répondu BalusC 2010-01-09 18:41:43

en regardant la documentation du pilote JDBC PostgreSQL, il ne semble pas vous supporter en ajoutant le schéma à la fin de l'url de connexion. Tu es sûr que ça doit marcher?

une solution de rechange serait de définir le chemin de recherche 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 sais pas hiberner assez pour commenter s'il est possible de lui enseigner un schéma.

0
répondu Magnus Hagander 2010-01-09 18:27:37