1

我正在使用 hibernate(3.6.9.Final) 和 oracle 11g 数据库和 jdbc(ojdbc6:oracle.jdbc.OracleDriver) 我的连接字符串是 jdbc:oracle:thin:@SERVERNAME:1521:ORCL 数据源:com.mchange.v2 .c3p0.ComboPooledDataSource

ioc:spring 3.0.7.RELEASE

服务器:tomcat 6

我的问题的描述是:我在我的 oracle 服务器 MY_SC 和 MY_OLD_SC 中定义了两个模式(用户),MY_OLD_SC 代表我的应用程序的旧模式,并且表 MY_TABLE 具有一个列名 MY_ID MY_SC 是我的应用程序的最新模式,并且有 MY_TABLE 但除了 MY_ID 列它还有 MY_NAME 列

当我使用 MY_SC 用户启动我的应用程序并在验证时休眠时,我因以下异常而失败:

org.hibernate.HibernateException:缺少列:MY_OLD_SC.MY_TABLE 中的 MY_NAME

即使我验证了我与 MY_SC 用户连接,它似乎连接到错误的模式,只有在我从数据库中删除 MY_OLD_SC 之后,我才能连接到 MY_SC。

这个问题有时并不一致,我可以使用不同的骗局,但是当它失败一次时,我必须删除数据库中的所有模式,除了我想要使用的模式。大多数情况下,它发生在我使用新模式的 impdp 之后,但不仅仅是在 impdp 之后

请注意,如果我与 sql developerper 连接,则与用户的连接似乎是正确的。

创建用户的声明:

CREATE USER username IDENTIFIED BY username
       DEFAULT TABLESPACE USERS  
       TEMPORARY TABLESPACE temp
       QUOTA UNLIMITED ON USERS;


GRANT conn TO username;

impdb 的代码:

./impdp system/pass@orcl remap_schema=org_name:new_name directory=DATA_PUMP_DIR TRANSFORM=oid:n dumpfile=backup.dmp

如果您知道可能是什么问题,那就太好了,也许我需要以不同的方式创建用户?什么可能导致这个问题?

提前感谢

4

3 回答 3

1

我最近在使用 Hibernate 3.3.0 时遇到了这个问题。基本上,在验证期间运行的 Hibernate 数据库元数据扫描程序将拾取与您的实体定义匹配的任何表,无论它来自哪个模式,只要它具有对表定义的读取访问权限(不一定是对表本身的读取访问权限)。它按字母顺序获取它们,因此如果您的实体用于表WIDGET并且您的目标模式是MY_APP_SCHEMA但还有另一个WIDGETin ANOTHER_APPS_SCHEMA,则ANOTHER_APPS_SCHEMAHibernate 将使用 from 来验证实体。

我无法在 Hibernate 的网站上找到任何官方信息,但确实在此处此处找到了类似的帖子。

您可以使用hibernate.default_schema来设置 Hibernate 使用的模式。

于 2014-02-09T22:43:24.507 回答
0

有一种更简洁的方法可以将休眠指向默认模式 - 在服务器启动时使用环境属性。在 java jvm 上使用:

-Dhibernate.default_schema=YOUR_SCHEMA
于 2014-03-28T05:54:12.677 回答
0

一种解决方案是设置hibernate.default_schema属性以适合您的用户(在您的持久性单元中或作为 TomaszZ. 指出的 env 属性)。

其他解决方案是撤销用户访问其他模式的权限。由于潜在的安全问题,这也不应该被允许(除非该特定用户需要这种访问权限)。

于 2015-10-09T13:31:53.087 回答