我正在使用JPA和c3p0并尝试查询表并返回堆栈跟踪,声称该表不存在。我可以打开与db的连接,例如,DbVisualizer,并在那里查看表。事实上,我的应用程序的调试语句显示它能够建立连接并测试其可行性。但后来却找不到桌子。
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 [com.mchange.v2.c3p0.impl.NewPooledConnection@4d687dcd] on CHECKOUT.
15:45:53.949 [http-8080-1] DEBUG c.m.v.c.i.C3P0PooledConnectionPool - Test of PooledConnection [com.mchange.v2.c3p0.impl.NewPooledConnection@4d687dcd] on CHECKOUT has SUCCEEDED.
15:45:53.950 [http-8080-1] DEBUG c.m.v.resourcepool.BasicResourcePool - trace com.mchange.v2.resourcepool.BasicResourcePool@7930ebb [managed: 3, unused: 2, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@3e30e173)
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 - com.mchange.v2.c3p0.impl.NewPooledConnection@4d687dcd 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 / main / resources / 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>
我发现可疑的是hibernate查询中试图查询select ... from reportsDb.alerts alert0_
的部分 - 如何确认“reportsDb”实际上代表我在applicationContext.xml中指定的数据源?
ETA: 实体Alert,如下所示:
@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 :(得分:6)
如果表格确实存在于mySQL中,并且您使用Linux / Unix,并且错误显示表名称为错误/大写,则问题是MySQL中的表名称区分大小写并且休眠它是上壳。我正在使用hibernate 4.3。
我刚遇到这个问题。这里的解释:lower_case_table_names=1
- edit--回想起来,最好找到并更改任何@Table或hbm.xml引用以匹配数据库。我运行了一个生成带有大写名称的hbm.xml的向导 - 直到现在才意识到它在我的项目中。我会把它留在这里让人们意识到区分大小写。
- 编辑结束 -
以下是我修复它的方法:
将此添加到/etc/mysql/my.conf:
set lower_case_table_names=1 #(default value '0').
答案 1 :(得分:4)
从您的实体定义中删除catalog = 'reportsDb'
部分,因为它用于构建select from 'reportsDb.alerts'
之类的查询。
Mysql不使用目录,AFAIK。
答案 2 :(得分:3)
在我的代码中彻底消除了表XYZ
的每一次出现之后,我发现了实际问题:XYZ
没有被JPA引用,而是被一个旧的,无效的mysql触发器引用。也许可以考虑在代码之外查找错误。
答案 3 :(得分:3)
在我的情况下,这是一个Hibernate将我的表转换为小写的问题。
我的错误是:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'Pluto.c_story' doesn't exist
Pluto是我的数据库,C_Story是我的表(注意:不是c_story - 小写)。
我所要做的就是以下几点:
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
嗯,我希望这有助于某人。
答案 4 :(得分:1)
我们遇到了同样的问题。有一个SQL查询没有传递错误,如
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Table 'my_database_name。*'不存在
但查询本身不包含 my_database_name 引用甚至*符号。
与其他查询相比,我们发现差异并且添加了ORDER BY来查询并且错误消失了。可能是围绕jdbc或c3p0逻辑的黑客攻击,但它对我们有用。
答案 5 :(得分:1)
在我的情况下,原因是因为带有别名的子查询上的左外连接,这是在sql编辑器上工作但在JDBCspring上没有,所以我删除了子查询的左外连接并用左外连接替换了没有子查询
答案 6 :(得分:1)
我有同样的问题,我的mysql数据库是在Windows上,但我把它移动到linux,导致mysql语法无法识别表。 原因是Windows上的mysql不区分大小写并且在Linux上区分大小写 我能够解决这个问题。
lower_case_table_names = 1
在my.cnf。
还要确保包含
的[mysqld]
在my.cnf的开头,以避免另一个错误
“MySQL my.cnf文件 - 找不到前一组的选项”
答案 7 :(得分: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>
将“create-drop”替换为“update”
感谢
答案 8 :(得分:1)
我也遇到了这个错误。在我的例子中,我在jdbc数据源类中写了错误的数据库名称。
我写了cms
jdbc:mysql://localhost:3306/cms
<bean id="jdbcDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/cms" />
<property name="username" value="root" />
<property name="password" value="" />
</bean>
实际上,我的数据库名称为hit_kcsl
jdbc:mysql://localhost:3306/hit_kcsl
<bean id="jdbcDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/hit_kcsl" />
<property name="username" value="root" />
<property name="password" value="" />
</bean>
答案 9 :(得分:0)
就我而言,我在cfg.xml中映射了错误的方言,我使用的是MySQL57数据库,但使用的是MySQL方言。当我将正确的方言替换为MySQL57Dialect时,它就起作用了。
答案 10 :(得分:0)
只需将属性添加到 hibernate.cfg.xml 文件中,然后更新 项目然后运行main方法,异常将消失..谢谢 你..
<session-factory><property name="hibernate.hbm2ddl.auto">create</property> </session-factory>