2010-04-28 88 views
7

Tengo algunos problemas al tratar de trabajar con PostgreSQL e Hibernate, más específicamente, el problema mencionado en el título. He estado buscando en la red por unas horas pero ninguna de las soluciones encontradas funcionó para mí.Hibernate + PostgreSQL: la relación no existe - Error SQL: 0, SQLState: 42P01

Estoy usando Eclipse Java EE IDE para desarrolladores web. ID de compilación: 20090920-1017 con HibernateTools, Hibernate 3, PostgreSQL 8.4.3 en Ubuntu 9.10.

Éstos son los archivos relevantes:

Message.class

package hello; 

     public class Message { 
     private Long id; 
     private String text; 

     public Message() { 
     } 

     public Long getId() { 
      return id; 
     } 

     public void setId(Long id) { 
      this.id = id; 
     } 

     public String getText() { 
      return text; 
     } 

     public void setText(String text) { 
      this.text = text; 
     } 
     } 

Message.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping package="hello"> 
    <class 
    name="Message" 
    table="public.messages"> 
    <id name="id" column="id"> 
    <generator class="assigned"/> 
    </id> 
    <property name="text" column="messagetext"/> 
    </class> 
</hibernate-mapping> 

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.connection.driver_class">org.postgresql.Driver</property> 
     <property name="hibernate.connection.password">bar</property> 
     <property name="hibernate.connection.url">jdbc:postgresql:postgres/tommy</property> 
     <property name="hibernate.connection.username">foo</property> 
     <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property> 
     <property name="show_sql">true</property> 
     <property name="log4j.logger.org.hibernate.type">DEBUG</property> 
     <mapping resource="hello/Message.hbm.xml"/> 
    </session-factory> 
</hibernate-configuration> 

principal estructura

package hello; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.Transaction; 
import org.hibernate.cfg.Configuration; 

public class App { 

public static void main(String[] args) { 
    SessionFactory sessionFactory = new Configuration().configure() 
    .buildSessionFactory(); 

    Message message = new Message(); 
    message.setText("Hello Cruel World"); 
    message.setId(2L); 

    Session session = null; 
    Transaction transaction = null; 
    try { 
    session = sessionFactory.openSession(); 
    transaction = session.beginTransaction(); 
    session.save(message); 
    } catch (Exception e) { 
    System.out.println("Exception attemtping to Add message: " 
    + e.getMessage()); 

    } finally { 
    if (session != null && session.isOpen()) { 
    if (transaction != null) 
    transaction.commit(); 
    session.flush(); 
    session.close(); 
    } 

    } 
} 
} 

Tabla:

foo=# \d messages 
Table "public.messages" 
    Column | Type | Modifiers 
-------------+---------+----------- 
id   | integer | 
messagetext | text | 

Eclipse salida de la consola cuando lo ejecuto

Apr 28, 2010 11:13:53 PM org.hibernate.cfg.Environment <clinit> 
INFO: Hibernate 3.5.1-Final 
Apr 28, 2010 11:13:53 PM org.hibernate.cfg.Environment <clinit> 
INFO: hibernate.properties not found 
Apr 28, 2010 11:13:53 PM org.hibernate.cfg.Environment buildBytecodeProvider 
INFO: Bytecode provider name : javassist 
Apr 28, 2010 11:13:53 PM org.hibernate.cfg.Environment <clinit> 
INFO: using JDK 1.4 java.sql.Timestamp handling 
Apr 28, 2010 11:13:53 PM org.hibernate.cfg.Configuration configure 
INFO: configuring from resource: /hibernate.cfg.xml 
Apr 28, 2010 11:13:53 PM org.hibernate.cfg.Configuration getConfigurationInputStream 
INFO: Configuration resource: /hibernate.cfg.xml 
Apr 28, 2010 11:13:53 PM org.hibernate.cfg.Configuration addResource 
INFO: Reading mappings from resource : hello/Message.hbm.xml 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.HbmBinder bindRootPersistentClassCommonValues 
INFO: Mapping class: hello.Message -> public.messages 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.Configuration doConfigure 
INFO: Configured SessionFactory: null 
Apr 28, 2010 11:13:54 PM org.hibernate.connection.DriverManagerConnectionProvider configure 
INFO: Using Hibernate built-in connection pool (not for production use!) 
Apr 28, 2010 11:13:54 PM org.hibernate.connection.DriverManagerConnectionProvider configure 
INFO: Hibernate connection pool size: 20 
Apr 28, 2010 11:13:54 PM org.hibernate.connection.DriverManagerConnectionProvider configure 
INFO: autocommit mode: false 
Apr 28, 2010 11:13:54 PM org.hibernate.connection.DriverManagerConnectionProvider configure 
INFO: using driver: org.postgresql.Driver at URL: jdbc:postgresql:postgres/tommy 
Apr 28, 2010 11:13:54 PM org.hibernate.connection.DriverManagerConnectionProvider configure 
INFO: connection properties: {user=foo, password=****} 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: RDBMS: PostgreSQL, version: 8.4.3 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: JDBC driver: PostgreSQL Native Driver, version: PostgreSQL 8.4 JDBC4 (build 701) 
Apr 28, 2010 11:13:54 PM org.hibernate.dialect.Dialect <init> 
INFO: Using dialect: org.hibernate.dialect.PostgreSQLDialect 
Apr 28, 2010 11:13:54 PM org.hibernate.engine.jdbc.JdbcSupportLoader useContextualLobCreation 
INFO: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException 
Apr 28, 2010 11:13:54 PM org.hibernate.transaction.TransactionFactoryFactory buildTransactionFactory 
INFO: Using default transaction strategy (direct JDBC transactions) 
Apr 28, 2010 11:13:54 PM org.hibernate.transaction.TransactionManagerLookupFactory getTransactionManagerLookup 
INFO: No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended) 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: Automatic flush during beforeCompletion(): disabled 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: Automatic session close at end of transaction: disabled 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: JDBC batch size: 15 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: JDBC batch updates for versioned data: disabled 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: Scrollable result sets: enabled 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: JDBC3 getGeneratedKeys(): enabled 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: Connection release mode: auto 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: Default batch fetch size: 1 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: Generate SQL with comments: disabled 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: Order SQL updates by primary key: disabled 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: Order SQL inserts for batching: disabled 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory createQueryTranslatorFactory 
INFO: Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory 
Apr 28, 2010 11:13:54 PM org.hibernate.hql.ast.ASTQueryTranslatorFactory <init> 
INFO: Using ASTQueryTranslatorFactory 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: Query language substitutions: {} 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: JPA-QL strict compliance: disabled 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: Second-level cache: enabled 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: Query cache: disabled 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory createRegionFactory 
INFO: Cache region factory : org.hibernate.cache.impl.NoCachingRegionFactory 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: Optimize cache for minimal puts: disabled 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: Structured second-level cache entries: disabled 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: Echoing all SQL to stdout 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: Statistics: disabled 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: Deleted entity synthetic identifier rollback: disabled 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: Default entity-mode: pojo 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: Named query checking : enabled 
Apr 28, 2010 11:13:54 PM org.hibernate.cfg.SettingsFactory buildSettings 
INFO: Check Nullability in Core (should be disabled when Bean Validation is on): enabled 
Apr 28, 2010 11:13:54 PM org.hibernate.impl.SessionFactoryImpl <init> 
INFO: building session factory 
Apr 28, 2010 11:13:55 PM org.hibernate.impl.SessionFactoryObjectFactory addInstance 
INFO: Not binding factory to JNDI, no JNDI name configured 
Hibernate: insert into public.messages (messagetext, id) values (?, ?) 
Apr 28, 2010 11:13:55 PM org.hibernate.util.JDBCExceptionReporter logExceptions 
WARNING: SQL Error: 0, SQLState: 42P01 
Apr 28, 2010 11:13:55 PM org.hibernate.util.JDBCExceptionReporter logExceptions 
SEVERE: Batch entry 0 insert into public.messages (messagetext, id) values ('Hello Cruel World', '2') was aborted. Call getNextException to see the cause. 
Apr 28, 2010 11:13:55 PM org.hibernate.util.JDBCExceptionReporter logExceptions 
WARNING: SQL Error: 0, SQLState: 42P01 
Apr 28, 2010 11:13:55 PM org.hibernate.util.JDBCExceptionReporter logExceptions 
SEVERE: ERROR: relation "public.messages" does not exist 
    Position: 13 
Apr 28, 2010 11:13:55 PM org.hibernate.event.def.AbstractFlushingEventListener performExecutions 
SEVERE: Could not synchronize database state with session 
org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update 
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92) 
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) 
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263) 
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:179) 
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) 
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206) 
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375) 
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137) 
at hello.App.main(App.java:31) 
Caused by: java.sql.BatchUpdateException: Batch entry 0 insert into public.messages (messagetext, id) values ('Hello Cruel World', '2') was aborted. Call getNextException to see the cause. 
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2569) 
at org.postgresql.core.v3.QueryExecutorImpl$1.handleError(QueryExecutorImpl.java:459) 
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1796) 
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407) 
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2708) 
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) 
... 8 more 
Exception in thread "main" org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update 
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92) 
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) 
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263) 
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:179) 
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) 
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206) 
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375) 
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137) 
at hello.App.main(App.java:31) 
Caused by: java.sql.BatchUpdateException: Batch entry 0 insert into public.messages (messagetext, id) values ('Hello Cruel World', '2') was aborted. Call getNextException to see the cause. 
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2569) 
at org.postgresql.core.v3.QueryExecutorImpl$1.handleError(QueryExecutorImpl.java:459) 
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1796) 
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407) 
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2708) 
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) 
... 8 more 

PostgreSQL archivo de registro

2010-04-28 23:13:55 EEST LOG: execute S_1: BEGIN 
2010-04-28 23:13:55 EEST ERROR: relation "public.messages" does not exist at character 13 
2010-04-28 23:13:55 EEST STATEMENT: insert into public.messages (messagetext, id) values ($1, $2) 
2010-04-28 23:13:55 EEST LOG: unexpected EOF on client connection 

Si copiar/pegar la consulta en la línea de comandos PostgreSQL y poner los valores de y; después de eso, funciona.

Todo está en minúscula, así que no creo que sea ese el problema.

Si cambio a MySQL, el mismo código del mismo proyecto (solo cambio el controlador, URL, autenticación), funciona.

En Eclipse Datasource Explorer, puedo hacer ping al DB y tiene éxito. Lo extraño es que tampoco puedo ver las tablas desde allí. Se expande el esquema público pero no expande las tablas. ¿Podría ser algún problema de permiso?

Gracias!

Respuesta

4

Su URL JDBC es "jdbc: postgresql: postgres/tommy", que es inusual. El documentation sugiere "jdbc: // nombre de host/nombre de base de datos". Las instalaciones modernas vienen con una base de datos "postgres" que casi definitivamente no es a lo que se quiere conectar; No sé qué tan estricto es el análisis de URL del controlador JDBC.

¿Qué esperas que sean el nombre de tu base de datos y tu nombre de host? p.ej. ¿Cuáles son sus parámetros para psql para conectarse a la base de datos de esa manera?

Sugerencia: en postgresql.conf, algunos ajustes que se pueden considerar:

log_connections = on 
log_disconnections = on 
log_line_prefix = '%t %c %q%[email protected]%h:%d ' 

Si el error es lo que pienso (se conecta a la base de datos incorrecta), esto sería registrar cosas como el nombre de la base de datos junto con el error en su postgresql.log archivo.

+0

¡Tenías razón! Edité el conf y descubrí que me estaba conectando a la base de datos postgres. Obtuve la url del explorador de origen de datos, que era la predeterminada y pensé que esa es la 'raíz' y puse mi nombre db, tommy, después ... Mi nueva URL: jdbc: postgresql: tommy y esto trabajos. No sé sobre la forma que sugiere la documentación, probé jdbc: // localhost/postgresql/tommy pero no funcionó. De todos modos, ahora funciona con el jdbc: postgresql: tommy url, ¡muchas gracias! – user328229

+0

ese formato de URL también se recomienda, cuando la base de datos está en el mismo host que el cliente. – araqnid

+0

Esos registros son realmente útiles. En mi caso, a Postgres no le gusta el dialecto que usa Spring JPA, que tiene la forma << select ... from schema.table >>. En cambio, Postgres quiere << seleccionar ... desde el esquema. "Tabla" >>. Ahora tengo que descubrir cómo hacer que JPA use esa forma. – riverhorse

5

Acabo de resolver el mismo problema/similar especificando el esquema.

@Entity 
@Table(name = "mytable", schema="myschema") 
public class MyTable implements Serializable { 
    ... 
1

Otra respuesta puede ser verificar los permisos del esquema, lo que puede ser útil para otros que encuentren el encabezado de esta pregunta. Tenía los mismos síntomas exactos con respecto al mensaje de error que era;

<SQL Error: 0, SQLState: 42P01> 
<ERROR: relation "tablename" does not exist> 

La solución era permitir permisos en ese esquema para el usuario que estaba usando para iniciar sesión con.

También: Observando que una buena herramienta de diagnóstico aquí es iniciar sesión en la consola de línea de comandos de postgres con el mismo usuario que su programa está usando e intentar acceder a la tabla y al esquema de la misma manera.

Cuestiones relacionadas