无法打开 JPA EntityManager 进行事务处理;嵌套异常是 org.hibernate.exception.SQLGrammarException:无法获取 JDBC 连接
Posted
技术标签:
【中文标题】无法打开 JPA EntityManager 进行事务处理;嵌套异常是 org.hibernate.exception.SQLGrammarException:无法获取 JDBC 连接【英文标题】:Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.SQLGrammarException: Unable to acquire JDBC Connection 【发布时间】:2016-07-03 22:18:24 【问题描述】:当我运行我的代码时,我得到了这个异常
线程“主”org.springframework.transaction.CannotCreateTransactionException 中的异常:无法为事务打开 JPA EntityManager;嵌套异常是 org.hibernate.exception.SQLGrammarException:无法获取 JDBC 连接 在 org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:431) 在 org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373) 在 org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:427) 在 org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:276) 在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208) 在 com.sun.proxy.$Proxy24.addEntite(未知来源) 在 com.Barid.stockapp.test.Test.main(Test.java:23) 原因:org.hibernate.exception.SQLGrammarException:无法获取 JDBC 连接 在 org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63) 在 org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97) 在 org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:102) 在 org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection(LogicalConnectionManagedImpl.java:129) 在 org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getConnectionForTransactionManagement(LogicalConnectionManagedImpl.java:247) 在 org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.begin(LogicalConnectionManagedImpl.java:254) 在 org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.begin(JdbcResourceLocalTransactionCoordinatorImpl.java:204) 在 org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:56) 在 org.springframework.orm.jpa.DefaultJpaDialect.beginTransaction(DefaultJpaDialect.java:67) 在 org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:380) ... 8 更多 引起:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:用户''@'localhost'拒绝访问数据库'stock' 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 com.mysql.jdbc.Util.handleNewInstance(Util.java:404) 在 com.mysql.jdbc.Util.getInstance(Util.java:387) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:942) 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3966) 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3902) 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:875) 在 com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1712) 在 com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1228) 在 com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2253) 在 com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2284) 在 com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2083) 在 com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:806) 在 com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:47) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 com.mysql.jdbc.Util.handleNewInstance(Util.java:404) 在 com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:410) 在 com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:328) 在 java.sql.DriverManager.getConnection(DriverManager.java:664) 在 java.sql.DriverManager.getConnection(DriverManager.java:208) 在 org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:153) 在 org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:144) 在 org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:155) 在 org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:130) 在 org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) 在 org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection(NonContextualJdbcConnectionAccess.java:35) 在 org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:99) ... 15 更多请帮忙,我不知道这个错误是从哪里来的
这里是 applicationContext.xml:
[applicationContext.xml1
【问题讨论】:
请显示您的连接属性。您似乎没有指定用户名。 【参考方案1】:检查堆栈跟踪,它说: 用户 ''@'localhost' 拒绝访问数据库 'stock'
见Mysql Connection in Java: Access denied for user @ localhost
【讨论】:
我尝试更改连接属性,但没有任何变化 如上面引用的帖子中所述,您需要为 user@localhost 和 user@'%' 设置密码 MySQL区分本地访问和远程访问密码。 您正在与 root 用户连接,尝试创建一个特定用户 - CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';授予 * 上的所有特权。 * TO 'newuser'@'localhost'; - 然后相应地更新数据源配置。 我试了几次,问题不在于我必须创建一个用户,问题是无论我指定哪个用户,错误都会显示相同的消息:用户的访问被拒绝'@'localhost' 到数据库'stock' 尝试使用 drop user ''@'localhost' 删除匿名用户;【参考方案2】:我在我的应用程序中遇到了同样的问题,数据库连接被拒绝无法建立连接,因为我使用的是 mysql-connector-java 版本 6.0.6
由于在 mysql-connector-java 的更新版本中,他们提供了一些客户端身份验证,所以我将 mysql-connector-java 6.0.6 更改为 mysql-connector-java 5.1.30,它适用于我 :) .
谢谢
【讨论】:
以上是关于无法打开 JPA EntityManager 进行事务处理;嵌套异常是 org.hibernate.exception.SQLGrammarException:无法获取 JDBC 连接的主要内容,如果未能解决你的问题,请参考以下文章
org.springframework.transaction.CannotCreateTransactionException:无法为事务打开 JPA EntityManager
无法在使用 Arquillian 和 WildFly 的 JPA 集成测试中注入 EntityManager