最近在使用oracle进行项目开发时,碰到在hibernate中总是取得错误的表数据。错误的出处在于使用hibernate的update生成模式,hibernate会自动地生成相应的表结构信息,然而在生成数据表的过程当中,hibernate首先会进行数据库表的验证工作,即判断当前domain中的配置信息与数据表是否一致,如果已经有相应的信息之后,则不再生成相应的信息。
问题就在于此,hibernate是使用databaseMetadata这个java类来进行数据库表的识别工作,它通过
ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) throws SQLException
来读取数据表信息,并进行判断。在一般情况下,均能够读取正确的信息。但当数据库中存在着有相同的数据表(在不同的用户下)时,该操作会返回另一个用户创建的表信息。这样就导致了数据表上的验证不一致情况,而导致有些信息始终不能添加上(比如缺失外键关系,错误的外键关系等)。
问题原因找到了,即通过此方法不能读取正确的表信息,解决问题的方法就是首先解决为什么这个方法会读取到其它用户的表信息,经过google之后,问题被发现了。是因为当前用户被授权了可以访问其它用户表的权限,导致hibernate在使用此方法时,自然就会返回其它用户的表了。原先给该用户进行授权时使用了以下语句:
grant create any view,drop any view,imp_full_database,exp_full_database,connect,resource,create session to xxx
这样的授权方式,在角色imp_full_database,以及exp_full_database中,即包含了select any table的权限,从而导致了这样的问题发生。经过google,最终将该用户的权限控制为两个,即授予connect,resource权限,connect和resource实际上是两个角色。此角色所包含的权限如下所示:
CREATE SESSION UNLIMITED TABLES CREATE TABLE CREATE CLUSTER CREATE SEQUENCE CREATE PROCEDURE CREATE TRIGGER CREATE TYPE CREATE OPERATOR CREATE INDEXTYPE
这些权限已经足够进行开发了。其中没有create view权限,如果需要,手动加上即可。在这样的权限限制之下,再使用相应的方法即能够取得正确的数据表元信息了。
转载请标明出处:i flym
本文地址:https://www.iflym.com/index.php/code/minimize-user-privs-to-avoid-error-data-in-hibernate-development.html