it-swarm.com.de

PSQLException: ERROR: Relation "TABLE_NAME" ist nicht vorhanden

Ich versuche, den Ruhezustand auf einer PostgreSQL 8.4.2-Datenbank auszuführen. Wann immer ich versuche, einen einfachen Java-Code auszuführen, wie: 

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

Ich erhalte folgende Fehlermeldung:

PSQLException: ERROR: relation "TABLE_NAME" does not exist

Da ich die Option hibernate.show_sql auf true gesetzt habe, kann ich feststellen, dass hibernate versucht, den folgenden SQL-Befehl auszuführen:

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

In der Realität sollte es mindestens so laufen:

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

Weiß jemand, welche Änderungen ich vornehmen muss, damit Hibernate die richtige SQL für PostgreSQL erstellt?

Ich habe die erforderliche postgreSQL-Datenquelle in der Datei applicationContext.xml eingerichtet:

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

In derselben Datei habe ich die Session Factory mit PostgreSQL-Dialekt eingerichtet:

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

Schließlich ordne ich die Domänenklasse der Tabelle zu:

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

Hat jemand einen ähnlichen Fehler festgestellt? Jede Hilfe bei der Lösung dieses Problems wird sehr geschätzt. Bitte beachten Sie, dass die Frage sich von Post unterscheidet. PostgreSQL-Tabellenname kann nicht einfach verwendet werden ("Relation existiert nicht")

Entschuldigung für den langen Beitrag.

20
Lucas T

Sie müssen den Schemanamen in den Spring-Hibernate-Eigenschaften angeben, nicht in der JDBC-Verbindungs-URL:

<prop key="hibernate.default_schema">SCHEMA_NAME</prop>

Das heißt, Ihre JDBC-Verbindungs-URL ist tatsächlich syntaktisch ungültig. Gemäß der PostgreSQL-JDBC-Dokumentation müssen Sie eine der folgenden Syntaxen verwenden:

  • jdbc:postgresql:database
  • jdbc:postgresql://Host/database
  • jdbc:postgresql://Host:port/database

Die database ist hier der Datenbankname. Wenn der Host weggelassen wird, wird standardmäßig localhost verwendet. Wenn die Portnummer nicht angegeben wird, wird standardmäßig 5432 verwendet. Daher ist in Ihrem Fall eine der folgenden Bedingungen gültig:

  • jdbc:postgresql:DB_NAME
  • jdbc:postgresql://localhost/DB_NAME
  • jdbc:postgresql://localhost:5432/DB_NAME
21
BalusC

In der PostgreSQL JDBC-Treiberdokumentation scheint das Hinzufügen des Schemas am Ende der Verbindungs-URL nicht zu unterstützen. Bist du sicher, dass das funktionieren soll?

Um dieses Problem zu umgehen, können Sie den Suchpfad in der Datenbank so einstellen, dass er Ihr Schema enthält. Dies schlägt jedoch fehl, wenn Sie dieselbe Tabelle in mehreren Schemas verwenden.

Ich weiß nicht genug über den Winterschlaf, um zu kommentieren, ob es möglich ist, ihn über ein Schema zu unterrichten.

0
Magnus Hagander