我正在使用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
答案 0 :(得分:1)
我最近遇到了Hibernate 3.3.0这个问题。基本上,在验证期间运行的Hibernate数据库元数据扫描程序将选择与您的实体定义匹配的任何表,而不管它来自哪个模式,只要它具有对表定义的读访问权(不一定是对表本身的读访问权)。它按字母顺序获取它们,因此,如果您的实体用于表WIDGET
且您的目标架构为MY_APP_SCHEMA
,但WIDGET
中有另一个ANOTHER_APPS_SCHEMA
,则来自ANOTHER_APPS_SCHEMA
Hibernate将使用它来验证实体。
我无法在Hibernate的网站上找到任何官方内容,但确实找到了类似的帖子here和here。
您可以使用hibernate.default_schema
设置要使用的Hibernate架构。
答案 1 :(得分:0)
有一种更简洁的方法可以将hibernate指向默认架构 - 在服务器启动时使用environment属性。在java jvm上使用:
-Dhibernate.default_schema=YOUR_SCHEMA
答案 2 :(得分:0)
一种解决方案是设置 hibernate.default_schema 属性以适合您的用户(在持久性单元中或作为TomaszZ指出的env属性。指出)。
其他解决方案是撤消访问用户其他架构的权限。这也不应该被允许因为有些安全问题(除非这种访问是特定用户所必需的)。