2010-01-09 12 views
13

Próbuję uruchomić hibernację na DB 8.4 PostgreSQL. Ilekroć próbuję uruchomić prosty kod Javy jak:Wyjątek PSQLException: BŁĄD: relacja "TABLE_NAME" nie istnieje

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

pojawia się następujący błąd:

PSQLException: ERROR: relation "TABLE_NAME" does not exist 

Odkąd opcja hibernate.show_sql opcja ustawiona na wartość true, widzę, że próbuje hibernacji aby uruchomić następującą komendę SQL:

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

podczas gdy w rzeczywistości, powinien on przynajmniej uruchomić coś takiego:

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

Czy ktoś wie, jakie zmiany należy wprowadzić dla Hibernate, aby wygenerować odpowiedni kod SQL dla PostgreSQL?

mam skonfigurować niezbędne źródło danych PostgreSQL w pliku 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> 

W tym samym pliku I utworzyły fabrykę sesji z PostgreSQL dialekcie:

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

Wreszcie, sposób mapowania klasy domeny na tabelę to:

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

Jest anyon e napotkał podobny błąd ?. Każda pomoc w rozwiązaniu tego problemu będzie doceniona. Należy pamiętać, że pytanie jest inne niż po Cannot simply use PostgreSQL table name (”relation does not exist”)

Przeprosiny za długotrwały post.

+1

tylko zadać oczywiste: czy konto użytkownika dostępu do bazy danych mają uprawnień, by zobaczyć tabelę NAZWA TABELI? (jeśli określiłeś schemat w połączeniu, możesz nie pomylić się pominięcie nazwy schematu z hibernacji). – davek

+0

Tak, mam na stole następujące pozwolenie: ALTER TABELA "SCHEMA_NAME". "TABLE_NAME" WŁAŚCICIELE Postgres; –

Odpowiedz

17

musisz określić nazwę schematu właściwości Hibernate na wiosnę, a nie w połączeniu URL JDBC:

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

Powiedział, że połączenie URL JDBC w rzeczywistości jest niepoprawne składniowo. Według PostgreSQL JDBC documentation trzeba użyć jednej z poniższych składni:

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

database jest tutaj nazwa bazy danych. Jeśli host zostanie pozostawiony, domyślnie będzie to localhost.Jeśli numer portu zostanie pominięty, domyślnie będzie to 5432. Tak więc jeden z poniższych jest ważna w przypadku:

  • jdbc:postgresql:DB_NAME
  • jdbc:postgresql://localhost/DB_NAME
  • jdbc:postgresql://localhost:5432/DB_NAME
+0

Wypróbuję twoje rozwiązanie od razu, BalusC. Zakładałem, że adres URL połączenia jest prawidłowy, ponieważ użyłem go do przetestowania połączenia z DB ze sterownikiem postgresql-8.4-701.jdbc4.jar, a także z klientem SQL SQuirrel. –

+0

Jeśli przedrostek (w tym przypadku 'jdbc: postgresql') jest poprawny, to sterownik często nie będzie generował' SQLException', ale końcowa część oryginalnego adresu URL jest syntaktycznie nieważna. Nie powinieneś polegać na przebaczaniu kierowców za to. – BalusC

+0

Próbowałem twojej sugestii dla połączenia z bazą danych DB i wygląda na to, że działa. Dostaję teraz inny typ błędu: PSQLException: BŁĄD: schemat "nazwa_schematu" nie istnieje. I hibernacja utworzyła następującą instrukcję: wybierz this_.USERNAME jako USERNAME0_0_, this_.PASSWORD jako PASSWORD0_0_ z SCHEMA_NAME. "TABLE_NAME" this_. Mogę tylko założyć, że twoje sugerowane rozwiązanie rzeczywiście rozwiązało problem i jest tylko kolejny problem do rozwiązania. –

0

Patrząc na dokumentację sterownika JDBC PostgreSQL, nie obsługuje ona dodawania schematu na końcu adresu URL połączenia. Jesteś pewien, że to powinno zadziałać?

Obejście problemu polegałoby na ustawieniu w bazie danych ścieżki szukania w celu uwzględnienia schematu, co oczywiście nie powiedzie się, jeśli ta sama tabela występuje w wielu schematach.

Nie znam stanu hibernacji na tyle, aby móc go skomentować, jeśli można go nauczyć o schemacie.

+1

Tak, przetestowałem połączenie przy użyciu sterownika postgresql-8.4-701.jdbc4.jar i użyłem tego adresu URL (jdbc: postgresql: // localhost/DB_NAME: 5432/SCHEMA_NAME), aby uzyskać udane połączenie z bazą danych. Zobaczę, jak korzystać ze ścieżki search_path, ponieważ używam tylko jednego schematu w postgresie. –

+0

Sprawdź jeszcze raz, dokumenty na http://jdbc.postgresql.org/documentation/84/connect.html nawet nie wspominają o schemacie. –

+0

Dziękuję, Milen. BalusC to wskazał. Jestem nowy w postgres i chociaż przeczytałem dokumentację, adres URL połączenia zadziałał podczas testowania sterownika, więc założyłem, że jest poprawny. Teraz wydaje mi się, że mam inny typ błędu. –

Powiązane problemy