2010-04-28 12 views
7

मुझे पोस्टग्रेएसक्यूएल और हाइबरनेट के साथ काम करने की कोशिश करने में कुछ समस्याएं हैं, विशेष रूप से, शीर्षक में उल्लिखित मुद्दा। मैं नेट के कुछ घंटों के लिए खोज कर रहा हूं लेकिन पाया गया कोई भी समाधान मेरे लिए काम नहीं करता है।हाइबरनेट + पोस्टग्रेएसक्यूएल: संबंध मौजूद नहीं है - एसक्यूएल त्रुटि: 0, एसक्यूएलस्टेट: 42 पी 01

मैं वेब डेवलपर्स के लिए एक्लिप्स जावा ईई आईडीई का उपयोग कर रहा हूं। आईडी बनाएं: 200 9 0 9 20-1017 हिबर्नेटटूल, हाइबरनेट 3, पोस्टग्रेएसक्यूएल 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 

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 पर स्विच करता हूं, तो वही कोड एक ही प्रोजेक्ट (मैं केवल ड्राइवर, यूआरएल, प्रमाणीकरण बदलता हूं), यह काम करता है।

ग्रहण डेटासॉर एक्सप्लोरर में, मैं डीबी को पिंग कर सकता हूं और यह सफल होता है। अजीब बात यह है कि मैं वहां से टेबल नहीं देख सकता। यह सार्वजनिक स्कीमा का विस्तार करता है लेकिन यह टेबल का विस्तार नहीं करता है। क्या यह कुछ अनुमति मुद्दा हो सकता है?

धन्यवाद!

उत्तर

4

आपका जेडीबीसी यूआरएल "jdbc: postgresql: postgres/tommy" असामान्य है। documentation "jdbc: // hostname/databasename" सुझाता है। आधुनिक प्रतिष्ठान एक "पोस्टग्रेस" डेटाबेस के साथ आते हैं जो लगभग निश्चित रूप से वह नहीं है जिसे आप कनेक्ट करना चाहते हैं; मुझे नहीं पता कि जेडीबीसी चालक का यूआरएल पार्सिंग कितना सख्त है।

आप अपने डेटाबेस नाम और होस्टनाम की अपेक्षा क्या कर रहे हैं? जैसे डेटाबेस से कनेक्ट करने के लिए psql के लिए आपके पैरामीटर क्या हैं?

युक्ति: postgresql में।conf, कुछ सेटिंग्स आप विचार कर सकते हैं:

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

त्रुटि है मैं क्या सोचता हूँ (आप गलत डेटाबेस से कनेक्ट कर रहे हैं), यह आपके postgresql.log में त्रुटि के साथ डेटाबेस नाम जैसी चीज़ों के लिए लॉग इन करेंगे, तो फ़ाइल।

+0

आप सही थे! मैंने conf को संपादित किया और पाया कि मैं पोस्टग्रेज़ डेटाबेस से कनेक्ट कर रहा था। मुझे डेटासोर्स एक्सप्लोरर से यूआरएल मिला, जो डिफ़ॉल्ट था और मैंने सोचा कि यह 'रूट' है और इसके बाद मेरा डीबी नाम, टॉमी डाल दिया गया है ... मेरा नया यूआरएल: jdbc: postgresql: tommy और यह काम करता है। प्रलेखन के सुझाव के बारे में नहीं जानते, मैंने jdbc: // localhost/postgresql/tommy की कोशिश की लेकिन यह काम नहीं किया। वैसे भी, यह अब jdbc के साथ काम करता है: postgresql: tommy url, बहुत बहुत धन्यवाद! – user328229

+0

कि URL प्रारूप की भी अनुशंसा की जाती है, जब डेटाबेस क्लाइंट के समान होस्ट पर होता है। – araqnid

+0

वे लॉग वास्तव में उपयोगी हैं। मेरे मामले में, पोस्टग्रेस बोलीभाषा स्प्रिंग जेपीए उपयोग पसंद नहीं करता है, जो कि फॉर्म है << select ... schema.table से ...। इसके बजाय, पोस्टग्रेस चाहता है << चुनें ... स्कीमा से। "तालिका" >>। अब मुझे यह पता लगाना होगा कि जेपीए को उस फॉर्म का उपयोग कैसे करें। – 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> 

समाधान उस उपयोगकर्ता के लिए उस स्कीमा पर अनुमतियां सक्षम करना था जिसका उपयोग मैं लॉग इन करने के लिए कर रहा था।

यह भी ध्यान में रखते हुए कि एक अच्छा निदान उपकरण पोस्टग्रेस कमांड लाइन कंसोल में लॉग इन करना है, उसी उपयोगकर्ता के साथ आपका प्रोग्राम उपयोग कर रहा है और उसी तरह तालिका और स्कीमा तक पहुंचने का प्रयास कर रहा है।

संबंधित मुद्दे