2010-01-09 26 views
13

Tôi đang cố gắng chạy ngủ đông trên một DB PostgreSQL 8.4.2. Bất cứ khi nào tôi cố gắng chạy một mã java đơn giản như:PSQLException: ERROR: quan hệ "TABLE_NAME" không tồn tại

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

tôi nhận được lỗi sau:

PSQLException: ERROR: relation "TABLE_NAME" does not exist 

Kể từ khi tôi đã lựa chọn tùy chọn hibernate.show_sql thiết lập là true, tôi có thể thấy ngủ đông mà đang cố gắng để chạy các lệnh SQL sau:

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

Khi trong thực tế, nó ít nhất nên chạy cái gì đó như:

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

Có ai biết những thay đổi nào tôi cần phải thực hiện cho Hibernate để tạo đúng SQL cho PostgreSQL không?

Tôi đã thiết lập nguồn dữ liệu PostgreSQL cần thiết trong file 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> 

Cùng tập Tôi đã thiết lập nhà máy sản xuất phiên với PostgreSQL phương ngữ:

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

Cuối cùng, cách tôi ánh xạ lớp miền với bảng là:

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

Có anyon e gặp lỗi tương tự ?. Bất kỳ trợ giúp nào trong việc giải quyết vấn đề này sẽ được đánh giá cao. Xin lưu ý rằng câu hỏi khác với bài đăng Cannot simply use PostgreSQL table name (”relation does not exist”)

Xin lỗi cho bài đăng dài.

+1

chỉ để hỏi rõ ràng: hiện các tài khoản người dùng truy cập vào cơ sở dữ liệu đã cấp phép để xem bảng TABLE_NAME? (nếu bạn đã chỉ định lược đồ trong kết nối, nó có thể không sai để bỏ qua tên lược đồ từ chọn ngủ đông). – davek

+0

Có, tôi trên bàn có sự cho phép sau: ALTER TABLE "SCHEMA_NAME". "TABLE_NAME" CHỦ SỞ HỮU ĐẾN; –

Trả lời

17

Bạn cần phải xác định tên lược đồ trong tính Hibernate của mùa xuân, không phải trong URL kết nối JDBC:

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

Điều đó nói rằng, URL kết nối JDBC của bạn là trong thực tế cú pháp hợp lệ. Theo PostgreSQL JDBC documentation bạn phải sử dụng một trong những cú pháp sau:

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

Các database là ở đây tên cơ sở dữ liệu. Nếu máy chủ bị bỏ đi, máy chủ sẽ mặc định là localhost.Nếu số cổng còn lại, nó sẽ chỉ mặc định là 5432. Vì vậy, một trong những điều sau đây là hợp lệ trong trường hợp của bạn:

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

Tôi sẽ thử giải pháp của bạn ngay lập tức, BalusC. Tôi cho rằng URL kết nối là hợp lệ vì tôi đã sử dụng nó để kiểm tra kết nối với DB bằng trình điều khiển postgresql-8.4-701.jdbc4.jar và cũng trong Squirre SQL Client. –

+0

Nếu tiền tố (trong trường hợp này là 'jdbc: postgresql') là hợp lệ, thì Trình điều khiển sẽ thường không ném một' SQLException' cho điều đó, nhưng phần đuôi của URL ban đầu của bạn không hợp lệ về cú pháp. Bạn không nên dựa vào sự tha thứ của các trình điều khiển cho điều đó. – BalusC

+0

Tôi đã thử đề xuất của bạn cho kết nối URL db và có vẻ như nó hoạt động. Bây giờ tôi nhận được một loại lỗi khác: PSQLException: ERROR: lược đồ "schema_name" không tồn tại. Và hibernate đã tạo câu lệnh sau: chọn this_.USERNAME là USERNAME0_0_, this_.PASSWORD là PASSWORD0_0_ từ SCHEMA_NAME. "TABLE_NAME" this_. Tôi chỉ có thể giả định rằng giải pháp được đề xuất của bạn đã thực sự giải quyết vấn đề và chỉ có một vấn đề khác cần giải quyết. –

0

Nhìn vào tài liệu trình điều khiển JDBC PostgreSQL, có vẻ như nó không hỗ trợ bạn thêm lược đồ ở cuối url kết nối. Bạn có chắc là phải làm việc không?

Giải pháp thay thế là đặt search_path trong cơ sở dữ liệu để bao gồm lược đồ của bạn, nhưng điều đó rõ ràng sẽ thất bại nếu bạn có cùng một bảng trong nhiều lược đồ.

Tôi không biết ngủ đông đủ để nhận xét nếu có thể dạy về lược đồ.

+1

Có, tôi đã thử nghiệm kết nối bằng trình điều khiển postgresql-8.4-701.jdbc4.jar và tôi đã sử dụng URL đó (jdbc: postgresql: // localhost/DB_NAME: 5432/SCHEMA_NAME) để thực hiện kết nối thành công với DB. Tôi sẽ xem cách sử dụng search_path vì tôi chỉ sử dụng một lược đồ trong postgres. –

+0

Kiểm tra lại, tài liệu tại http://jdbc.postgresql.org/documentation/84/connect.html thậm chí không đề cập đến lược đồ. –

+0

Cảm ơn, Milen. BalusC chỉ ra điều đó. Tôi mới đến postgres và mặc dù tôi đã đọc tài liệu, url kết nối làm việc khi kiểm tra trình điều khiển vì vậy tôi giả định nó là chính xác. Bây giờ tôi dường như có một loại lỗi khác. –

Các vấn đề liên quan