我正在构建一个 Spring-mvc 项目(使用 JPA 和 Hibernate 进行数据库访问),该项目在我的开发箱上本地运行良好,并带有本地 MySQL 数据库。
现在我正尝试将快照放在暂存服务器上以供我的客户使用,但我遇到了麻烦。
Tomcat(经过一番周折)毫无怨言地部署了我的 war 文件,而且我可以通过浏览器从应用程序获得一些响应。
当我点击主页(位于 Spring Security 身份验证后面)时,它会将我重定向到登录页面,这个页面运行正常。我已将 Security 配置为查询数据库以获取用户详细信息,并且运行正常。实际上,数据库中密码的更改会反映在登录表单的行为中,因此我相信它确实可以访问数据库并查询表user
。
验证通过后,我们进入应用程序的第一个“真实”页面,然后我收到“数据访问失败”错误。服务器的控制台日志显示以下行(已删除):
ERROR org.hibernate.util.JDBCExceptionReporter - SELECT command denied to user
'myDbUser'@'localhost' for table 'asset'
但是,如果我使用完全相同的凭据从 shell 进入 MySQL,则从表中进行选择完全没有问题asset
:
[development@tomcat01stg]$ mysql -u myDbUser -pmyDbPwd dbName
...
mysql> \s
--------------
mysql Ver 14.12 Distrib 5.0.77, for redhat-linux-gnu (i686) using readline 5.1
Connection id: 199
Current database: dbName
Current user: myDbUser@localhost
...
UNIX socket: /var/lib/mysql/mysql.sock
--------------
mysql> select count(*) from asset;
+----------+
| count(*) |
+----------+
| 19 |
+----------+
1 row in set (0.00 sec)
我已经分解了我的 MySQL 访问设置,清除了用户并重新运行授予命令,从“localhost”设置了一个用户版本,从“%”设置了另一个用户版本,确保刷新权限......没有什么可以改变这个东西的行为。
是什么赋予了?
答案1
弄清楚了。
事实证明,您在 /src/main/resources/spring/database.properties 中输入的数据库配置用于数据库连接,但是当 Roo 执行“数据库逆向工程”时您提供给它的模式会通过所有 Roo 创建的模型类进行填充,并且用于在查询中指定表(schema.table)。
临时服务器的数据库名称与我本地机器上的数据库名称不同。因此,我使用的表名称(用本地数据库的架构名称填写)是错误的。当发生这种情况时,MySQL 会给出一条无权 SELECT 的错误消息,但实际上发生的是架构名称不匹配。
最快的做法是在临时服务器上重新创建数据库,并使用与我的开发箱上的名称匹配的名称。这解决了这个问题。