2010-01-09 186 views
13

Estoy intentando ejecutar hibernate en una base de datos PostgreSQL 8.4.2. Siempre que intente ejecutar un código de Java simple como:PSQLException: ERROR: la relación "TABLE_NAME" no existe

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

me sale el siguiente error:

PSQLException: ERROR: relation "TABLE_NAME" does not exist 

Desde que he opción hibernate.show_sql opción se establece en true, puedo ver que está tratando de hibernación ejecutar el siguiente comando SQL:

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

Cuando en realidad, por lo menos debería ejecutar algo como:

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

¿Alguien sabe qué cambios necesito hacer para que Hibernate produzca el SQL correcto para PostgreSQL?

He creado el origen de datos PostgreSQL necesarios en el archivo 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> 

En el mismo archivo que he levantado la fábrica sesión con PostgreSQL dialecto:

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

Por último, la La forma en que estoy mapeando la clase de dominio en la tabla es:

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

Has anyon e encontré un error similar ?. Cualquier ayuda para resolver este problema será muy apreciada. Tenga en cuenta que la pregunta es diferente para publicar Cannot simply use PostgreSQL table name (”relation does not exist”)

Disculpas por la larga publicación.

+1

sólo para preguntar lo obvio: ¿La cuenta de usuario para acceder a la base de datos tiene permisos para ver la tabla ¿NOMBRE DE LA TABLA? (Si ha especificado el esquema en la conexión, puede no ser incorrecto omitir el nombre de esquema de la selección de hibernación). – davek

+0

Sí, tengo en la mesa el siguiente permiso: ALTER TABLE "SCHEMA_NAME". PROPIETARIO "TABLE_NAME" PARA postgres; –

Respuesta

17

es necesario especificar el nombre del esquema de propiedades de hibernación de la primavera, no en el URL de conexión JDBC:

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

Dicho esto, la URL de conexión JDBC es, de hecho, sintácticamente válida. De acuerdo con la PostgreSQL JDBC documentation usted tiene que utilizar una de las siguientes sintaxis:

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

El database es aquí el nombre de la base de datos. Si el host se deja, se establecerá de manera predeterminada en localhost.Si el número de puerto se deja, se configurará de manera predeterminada en 5432. Por lo tanto, uno de los siguientes es aplicable en su caso:

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

Voy a probar su solución de inmediato, BalusC. Supuse que la URL de conexión era válida, ya que la utilicé para probar la conexión a DB con el controlador postgresql-8.4-701.jdbc4.jar y también en SQuirrel SQL Client. –

+0

Si el prefijo (en este caso 'jdbc: postgresql') es válido, entonces el controlador a menudo no arrojará una' SQLException' para eso, pero la parte posterior de su URL original no es sintácticamente válida. No deberías confiar en el perdón de los conductores por eso. – BalusC

+0

He intentado con tu sugerencia para la conexión de URL db y parece que funciona. Ahora obtengo un tipo diferente de error: PSQLException: ERROR: el esquema "schema_name" no existe. Y hibernate creó la siguiente declaración: seleccione this_.USERNAME como USERNAME0_0_, this_.PASSWORD como PASSWORD0_0_ de SCHEMA_NAME. "TABLE_NAME" this_. Solo puedo suponer que su solución sugerida sí resolvió el problema y solo hay otro problema por resolver. –

0

Si observa la documentación del controlador JDBC de PostgreSQL, no parece ser compatible con agregar el esquema al final de la url de conexión. ¿Estás seguro de que se supone que debe funcionar?

Una solución alternativa sería establecer el search_path en la base de datos para incluir su esquema, pero eso obviamente fallaría si tiene la misma tabla en varios esquemas.

No sé hibernar lo suficiente como para comentar si es posible enseñarle sobre un esquema.

+1

Sí, he probado la conexión con el controlador postgresql-8.4-701.jdbc4.jar y utilicé esa URL (jdbc: postgresql: // localhost/DB_NAME: 5432/SCHEMA_NAME) para establecer una conexión correcta con el DB. Veré cómo usar el search_path ya que solo estoy usando un esquema en postgres. –

+0

Comprueba nuevamente, los documentos en http://jdbc.postgresql.org/documentation/84/connect.html ni siquiera mencionan el esquema. –

+0

Gracias, Milen. BalusC lo señaló. Soy nuevo en postgres y aunque he leído la documentación, la url de conexión funcionó al probar el controlador, así que supuse que era correcto. Ahora parece tener un tipo diferente de error. –

Cuestiones relacionadas