2010-04-28 4 views
7

PostgreSQL 및 최대 절전 모드, 특히 제목에서 언급 한 문제로 작업하려고 할 때 문제가 있습니다. 나는 지금 몇 시간 동안 그물을 찾고 있었지만 발견 된 해결책 중 어느 것도 나를 위해 일하지 못했습니다.Hibernate + PostgreSQL : 관계가 존재하지 않습니다 - SQL 오류 : 0, SQLState : 42P01

웹 개발자 용 Eclipse Java EE IDE를 사용하고 있습니다. 빌드 ID : 20090920-1017 HibernateTools, Hibernate 3, PostgreSQL 8.4.3, 우분투 9.10. 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> 

홈페이지

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(); 
    } 

    } 
} 
} 

테이블 구조 :

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

이클립스 콘솔 출력 나는 그것을 실행

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 
01 23,414,PostgreSQL의 로그 파일

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 

내가 복사하면 /를 postgre 명령 행에 쿼리를 붙여의 값을 넣어; 그 후에, 그것은 작동합니다.

모든 것이 소문자이므로 그 문제라고 생각하지 않습니다.

MySQL로 전환하면 동일한 코드 (동일한 드라이버, URL, 인증 만 변경)가 작동합니다.

이클립스 데이터 소스 익스플로러에서 DB에 ping을 보내면 성공합니다. 이상한 것은 내가 거기에서 테이블을 볼 수 없다는 것입니다. 공용 스키마를 확장하지만 테이블을 확장하지는 않습니다. 권한 문제 일 수 있습니까?

감사합니다.

답변

4

JDBC URL은 "jdbc : postgresql : postgres/tommy"입니다. 이는 비정상입니다. documentation은 "jdbc : // hostname/databasename"을 제안합니다. 현대적인 설치에는 거의 확실하게 연결하려는 "postgres"데이터베이스가 있습니다. JDBC 드라이버의 URL 구문 분석이 얼마나 엄격한 지 알 수 없습니다.

데이터베이스 이름과 호스트 이름을 어떻게 예상합니까? 예 : 그런 식으로 데이터베이스에 연결하는 psql의 매개 변수는 무엇입니까?

팁 : postgresql.conf의 일부 설정은 당신이 고려할 수 :

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

를 오류가 나는, 이것이 당신의 postgresql.log의 오류와 함께 데이터베이스 이름 등을 기록 할 (잘못된 데이터베이스에 연결하는) 생각하는 경우 파일.

+0

당신이 옳았습니다! conf를 편집하고 postgres 데이터베이스에 연결하고있는 것을 발견했습니다. 데이터 소스 탐색기에서 URL을 얻었습니다. 기본값이었습니다. 그 다음에 '루트'라고 생각하고 데이터베이스 이름 인 tommy를 넣었습니다. 새 URL : jdbc : postgresql : tommy and this 공장. 설명서에 나와있는 양식에 대해 모르겠다. jdbc : // localhost/postgresql/tommy를 시도했지만 작동하지 않았다. 어쨌든, jdbc : postgresql : tommy url과 함께 작동합니다. 정말 고마워요! – user328229

+0

은 데이터베이스가 클라이언트와 동일한 호스트에있는 경우에도 URL 형식을 권장합니다. – araqnid

+0

그 로그는 정말 유용합니다. 필자의 경우, Postgres는 JPA에서 사용하는 << select ... from schema.table >>이라는 형식의 스프링을 좋아하지 않습니다. 대신 Postgres는 << select ... from schema. ""Table ">>을 원합니다. 이제 JPA가 그 형식을 사용하는 방법을 알아 내야합니다. – riverhorse

5

나는 스키마를 지정하여 동일하거나 유사한 문제를 방금 해결했습니다. 이 질문의 주제 제목 건너 일이 다른 사람을 위해 유용 할 수 있습니다 -

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

또 다른 대답은 스키마 권한을 확인 할 수 있습니다. 나는 정확한 오류 메시지와 관련된 증상이 있었다.

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

해결 방법은 로그인 할 때 사용한 사용자의 해당 스키마에 대한 사용 권한을 활성화하는 것이 었습니다.

또한 좋은 진단 도구는 프로그램에서 사용하는 것과 동일한 사용자로 postgres 명령 줄 콘솔에 로그인하고 같은 방식으로 테이블과 스키마에 액세스하는 것입니다.

관련 문제