2013-04-29 14 views
5

मैं जेपीए और सी 3 पी 0 का उपयोग कर रहा हूं और एक टेबल से पूछताछ करने और एक स्टैक ट्रेस वापस लेने का प्रयास कर रहा हूं कि दावा नहीं है कि तालिका मौजूद नहीं है। मैं डीबी में कनेक्शन खोल सकता हूं, उदाहरण के लिए, डीबी विज़ुअलाइज़र, और वहां टेबल देखें। असल में, मेरे ऐप से डीबग स्टेटमेंट्स से पता चलता है कि यह कनेक्शन बनाने और इसकी व्यवहार्यता का परीक्षण करने में सक्षम है। लेकिन फिर यह टेबल नहीं ढूंढ रहा है।MySQLSyntaxErrorException: तालिका XYZ मौजूद नहीं है

15:45:53.940 [http-8080-1] DEBUG o.h.e.j.i.LogicalConnectionImpl - Obtaining JDBC connection 
15:45:53.940 [http-8080-1] DEBUG c.m.v.c.i.C3P0PooledConnectionPool - Testing PooledConnection [[email protected]] on CHECKOUT. 
15:45:53.949 [http-8080-1] DEBUG c.m.v.c.i.C3P0PooledConnectionPool - Test of PooledConnection [[email protected]] on CHECKOUT has SUCCEEDED. 
15:45:53.950 [http-8080-1] DEBUG c.m.v.resourcepool.BasicResourcePool - trace [email protected] [managed: 3, unused: 2, excluded: 0] (e.g. [email protected]) 
15:45:53.950 [http-8080-1] DEBUG o.h.e.j.i.LogicalConnectionImpl - Obtained JDBC connection 
15:45:53.966 [http-8080-1] DEBUG org.hibernate.SQL - select alert0_.rrdb_key as rrdb1_0_, alert0_.date as date0_, alert0_.hostname as hostname0_, alert0_.message as message0_, alert0_.program as program0_ from reportsDb.alerts alert0_ where (alert0_.message not like '%Anomolous%') and (alert0_.message not like '%Requeue%') 
Hibernate: select alert0_.rrdb_key as rrdb1_0_, alert0_.date as date0_, alert0_.hostname as hostname0_, alert0_.message as message0_, alert0_.program as program0_ from reportsDb.alerts alert0_ where (alert0_.message not like '%Anomolous%') and (alert0_.message not like '%Requeue%') 
15:45:54.013 [http-8080-1] DEBUG c.m.v2.c3p0.impl.NewPooledConnection - [email protected] handling a throwable. 
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'reportsDb.alerts' doesn't exist 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.6.0_45] 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) ~[na:1.6.0_45] 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) ~[na:1.6.0_45] 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) ~[na:1.6.0_45] 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) ~[mysql-connector-java-5.1.6.jar:na] 
... 

यहाँ persistence.xml है (/ src में/मुख्य/संसाधन/META-INF):

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
    <persistence-unit name="reportsDb" transaction-type="RESOURCE_LOCAL"> 
     <description>Hibernate</description> 
     <class>com.pronto.mexp.common.entity.Alert</class> 
    </persistence-unit> 
</persistence> 

applicationContext.xml की उपधारा:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.1.xsd"> 

    <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/> 

    <bean id="reportsDbEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="reportsDbDataSource" /> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
       <property name="showSql" value="true"/> 
       <property name="generateDdl" value="false" /> 
       <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> 
      </bean> 
     </property> 
     <property name="persistenceUnitName" value="reportsDb" /> 
     <property name="jpaDialect" ref="jpaDialect"/> 
    </bean> 

    <bean id="reportsDbDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
     <property name="driverClass" value="com.mysql.jdbc.Driver"/> 
     <!--<property name="jdbcUrl" value="jdbc:mysql://devdbrw01:3306/mexp"/>--> 
     <property name="jdbcUrl" value="jdbc:mysql://report101:3306/worker_events"/> 
     <property name="user" value="********"/> 
     <property name="password" value="********"/> 
     <property name="acquireRetryDelay" value="1000"/> 
     <property name="acquireRetryAttempts" value="4"/> 
     <property name="breakAfterAcquireFailure" value="false"/> 
     <property name="testConnectionOnCheckout" value="true"/> 
     <property name="maxConnectionAge" value="14400"/> 
     <property name="maxIdleTimeExcessConnections" value="1800"/> 
    </bean> 

    <!-- DAOs --> 
    <bean id="genericReportsDbDAO" class="com.pronto.mexp.common.dal.GenericReportsDbJPADAOImpl"/> 

    <bean id="alertJPADAO" class="com.pronto.mexp.dal.AlertJPADAOImpl" parent="genericReportsDbDAO"/> 
</beans> 

बात मैं संदिग्ध लगता है हाइबरनेट क्वेरी का हिस्सा है जहां यह select ... from reportsDb.alerts alert0_ से पूछताछ करने का प्रयास करता है - मैं कैसे पुष्टि करूं कि "reportsDb" वास्तव में मेरे डेटा स्रोत के लिए खड़ा है जिसे मैंने applicationContext.xml में spec'd किया था?

ईटीए: इकाई, चेतावनी, इस तरह दिखता है:

@Entity 
@Table(name = "alerts", catalog = "reportsDb") 
public class Alert { 

    int rrdbKey; 
    String hostname = ""; 
    String message = ""; 
    String program = ""; 
    Date date = new Date(); 

    @javax.persistence.Column(name = "rrdb_key", nullable = false, insertable = false, updatable = false, length = 10, precision = 0) 
    @Id 
    public int getRrdbKey() { 
     return rrdbKey; 
    } 

    public void setRrdbKey(int rrdbKey) { 
     this.rrdbKey = rrdbKey; 
    } 

    @javax.persistence.Column(name = "hostname", nullable = false, insertable = false, updatable = false, length = 32, precision = 0) 
    @Basic 
    public String getHostname() { 
     return hostname; 
    } 

    public void setHostname(String hostname) { 
     this.hostname = hostname; 
    } 

    @javax.persistence.Column(name = "message", nullable = false, insertable = false, updatable = false, length = 128, precision = 0) 
    @Basic 
    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 

    @javax.persistence.Column(name = "program", nullable = true, insertable = false, updatable = false, length = 40, precision = 0) 
    @Basic 
    public String getProgram() { 
     return program; 
    } 

    public void setProgram(String program) { 
     this.program = program; 
    } 

    @javax.persistence.Column(name = "date", nullable = false, insertable = false, updatable = false, length = 19, precision = 0) 
    @Basic 
    public Date getDate() { 
     return date; 
    } 

    public void setDate(Date date) { 
     this.date = date; 
    } 
} 
+0

कैसे इकाई कैसा दिखता है के साथ "बनाने ड्रॉप" की जगह? @Table एनोटेशन में आप तालिका, कैटलॉग और स्कीमा नाम – German

+0

@German - अच्छी बात बता सकते हैं, मैं भूल गया - जोड़ने के लिए संपादित किया गया। – barclay

उत्तर

4

अपने इकाई परिभाषा से, क्योंकि यह की तरह क्वेरी बनाने के लिए किया जा रहा है "सूची = 'reportsDb'" हिस्सा है, को दूर " "रिपोर्ट डीबी.अर्टर्ट्स 'से चुनें। माइस्क्ल कैटलॉग का उपयोग नहीं करता है, AFAIK

+0

आप दा आदमी। यह बहुत अच्छा काम किया। बहुत - बहुत धन्यवाद! – barclay

+0

मैंने पाया कि मेरे पास एक और टुकड़ा है जिसे एक ही सर्वर पर एक अलग डेटाबेस को इंगित करने की आवश्यकता है, इसलिए मैंने अपने डेटा स्रोत spec से applicationContext.xml में डेटाबेस "worker_events" को हटा दिया, और 'catalog =' worker_events'' को वापस जोड़ा मेरी इकाई वह काम किया। मूल रूप से, मैं डेटाबेस नाम के बजाय समग्र डेटा स्रोत नाम पर कैटलॉग इंगित करने का प्रयास कर रहा था। मेरा परीक्षण दिखाता है कि कैटलॉग MySQL के साथ काम करते हैं। – barclay

6

यदि तालिका वास्तव में, वास्तव में, मेरे एसक्यूएल में मौजूद है, और आपके लिनक्स/यूनिक्स का उपयोग कर रही है, और त्रुटि तालिका का नाम दिखाती है गलत/ऊपरी मामले में, तो मुद्दा यह है कि MySQL में तालिका नाम केस संवेदनशील हैं और हाइबरनेट उन्हें ऊपरी आवरण है। मैं हाइबरनेट 4.3 का उपयोग कर रहा हूं ।

मुझे बस यह समस्या थी। यहां स्पष्टीकरण: lower_case_table_names=1

--edit-- पीछे की ओर, डेटाबेस से मेल खाने के लिए किसी भी @Table या hbm.xml संदर्भों को ढूंढना और बदलना बेहतर है। मैंने एक जादूगर चलाया जिसने अपरकेस नामों के साथ एक hbm.xml उत्पन्न किया - यह नहीं पता था कि यह अभी तक मेरे प्रोजेक्ट में था। लोगों को केस संवेदनशीलता के बारे में जागरूक करने के लिए मैं इसे यहां छोड़ दूंगा।

edit--

की --end यहाँ कैसे मैं इसे ठीक किया गया है:

  1. ड्रॉप डेटाबेस।
  2. /etc/mysql/my.conf को यह करें:

    set lower_case_table_names=1 #(default value '0'). 
    
  3. पुनः प्रारंभ mysqld।
  4. डेटाबेस को मनोरंजन करें।
  5. (वैकल्पिक?) निचले मामले में एनोटेशन/एचबीएम.एक्सएमएल तालिका संदर्भ बदलें।
+0

चरण 1-4 मदद नहीं की। – Polyakoff

+0

मेरे पास अपरकेस tablenames के साथ एक क्वेरी थी और मुझे हमेशा संदेश तालिका मौजूद नहीं है। आपके लोअरकेस संकेत के लिए धन्यवाद। सब कुछ सुचारू रूप से काम करता है! :) – PrestigeDev

1

हमें एक ही समस्या का सामना करना पड़ा। टेबल 'my_database_name: एक SQL क्वेरी त्रुटि हेतु तरह

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException उत्तीर्ण नहीं की थी।* 'मौजूद नहीं है

लेकिन स्वयं क्वेरी से कोई my_database_name संदर्भ या यहाँ तक कि * संकेत निहित।

अन्य प्रश्नों की तुलना में, हमें अंतर मिला और जोड़ा गया क्वेरी और त्रुटि गायब हो गई। Jdbc या c3p0 तर्क के आसपास एक हैक हो सकता है, लेकिन यह हमारे लिए काम किया।

0

मेरे मामले में कारण की वजह से अन्य नाम के साथ सबक्वेरी पर शामिल होने के बाहरी छोड़ दिया गया था, कि JDBCspring पर नहीं एसक्यूएल संपादक पर काम कर रहा है लेकिन, तो मैं छोड़ दिया बाहरी सबक्वेरी के शामिल होने से हटाया और कोई सबक्वेरी

के साथ छोड़ दिया बाहरी से बदल दिया
2

मेरे कोड में तालिका XYZ तालिका के हर एक मौके को exasperadetly समाप्त करने के बाद, मुझे वास्तविक समस्या मिली: XYZ जेपीए द्वारा संदर्भित नहीं किया जा रहा था, लेकिन एक पुराने, अवैध mysql ट्रिगर द्वारा। शायद अपने कोड के बाहर त्रुटि की तलाश करने पर विचार करें।

1

मेरे पास एक ही समस्या थी, मेरा mysql डीबी विंडोज़ पर था, लेकिन मैंने इसे लिनक्स में ले जाया जिसके परिणामस्वरूप तालिका को पहचानने के लिए mysql वाक्यविन्यास नहीं हुआ। कारण था कि खिड़कियों पर mysql केस संवेदी और मामले linux पर संवेदनशील रहा my.cnf में यह मेरा जोड़ने

lower_case_table_names = 1

हल करने में सक्षम था।

इसके अलावा

my.cnf की शुरुआत में

[mysqld]

शामिल करने के लिए एक और त्रुटि

से बचने के लिए सुनिश्चित करें कि "MySQL my.cnf फ़ाइल - समूह पूर्ववर्ती बिना मिले विकल्प"

-1

मेरे कोड पर एक समान त्रुटि थी और मैं दृढ़ता फ़ाइल बदल

<properties> 
    <!-- Properties for Hibernate --> 
    <property name="hibernate.hbm2ddl.auto" value="create-drop" /> 
    <property name="hibernate.show_sql" value="false" /> 
    </properties> 

<properties> 
    <!-- Properties for Hibernate --> 
    <property name="hibernate.hbm2ddl.auto" value="update" /> 
    <property name="hibernate.show_sql" value="false" /> 
    </properties> 

करने के लिए "अद्यतन"

धन्यवाद

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