Oracle JDBC连接错误的用户

时间:2013-07-11 11:28:40

标签: oracle hibernate jdbc

我正在使用hibernate(3.6.9.Final)和oracle 11g数据库与jdbc(ojdbc6:oracle.jdbc.OracleDriver) 我的连接字符串是jdbc:oracle:thin:@SERVERNAME:1521:ORCL datasource: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。

这个问题不一致有时我能够使用不同的schams,但是当它失败一次然后我必须删除数据库中的所有模式,除了我想要使用的模式。 大部分时间都是在我使用新架构的impdp后发生的,但不仅仅是在impdp之后

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

创建用户的声明:

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

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

感谢advence

3 个答案:

答案 0 :(得分:1)

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

我无法在Hibernate的网站上找到任何官方内容,但确实找到了类似的帖子herehere

您可以使用hibernate.default_schema设置要使用的Hibernate架构。

答案 1 :(得分:0)

有一种更简洁的方法可以将hibernate指向默认架构 - 在服务器启动时使用environment属性。在java jvm上使用:

-Dhibernate.default_schema=YOUR_SCHEMA

答案 2 :(得分:0)

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

其他解决方案是撤消访问用户其他架构的权限。这也不应该被允许因为有些安全问题(除非这种访问是特定用户所必需的)。