sqlstate relación existe error 42p01 java hibernate postgresql

java - 42p01 - PSQLException: ERROR: la relación "TABLE_NAME" no existe



error 42p01 no existe la relación (2)

Estoy tratando de ejecutar hibernación en un DB PostgreSQL 8.4.2. Cada vez que intento ejecutar un simple código java como:

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

Obtuve el siguiente error:

PSQLException: ERROR: relation "TABLE_NAME" does not exist

Como tengo la opción hibernate.show_sql opción configurada como verdadera, puedo ver que hibernate está intentando ejecutar el siguiente comando SQL:

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

Cuando en realidad, al 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 debo hacer para que Hibernate produzca el SQL correcto para PostgreSQL?

He configurado el origen de datos postgreSQL necesario 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 he configurado la fábrica de sesiones con el dialecto 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>

Finalmente, la forma en que asigno la clase de dominio a la tabla es:

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

¿Alguien ha encontrado un error similar? Cualquier ayuda para resolver este problema será muy apreciada. Tenga en cuenta que la pregunta es diferente a la publicación No se puede usar simplemente el nombre de la tabla PostgreSQL ("la relación no existe")

Disculpas por el largo post.


Debe especificar el nombre del esquema en las propiedades de Hibernate de Spring, no en la URL de conexión de JDBC:

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

Dicho esto, su URL de conexión JDBC es, de hecho, sintácticamente inválida. De acuerdo con la documentación JDBC de PostgreSQL , debe usar una de las siguientes sintaxis:

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

La database es aquí el nombre de la base de datos. Si el host se queda, se establecerá de forma predeterminada en localhost . Si se deja el número de puerto, simplemente se predeterminará a 5432 . Por lo tanto, uno de los siguientes es válido en su caso:

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

Mirando la documentación del controlador JDBC de PostgreSQL, no parece admitir que agregue el esquema al final de la url de conexión. ¿Estás seguro de que se supone que funciona?

Una solución alternativa sería establecer la ruta de búsqueda en la base de datos para incluir su esquema, pero eso obviamente fallaría si tuviera la misma tabla en varios esquemas.

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