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.
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
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.