2013-07-11 114 views
1

我使用hibernate(3.6.9.Final)和Oracle 11g數據庫與jdbc(ojdbc6:oracle.jdbc.OracleDriver) 我的連接字符串是jdbc:oracle:thin:@SERVERNAME :1521:ORCL 數據源:com.mchange.v2.c3p0.ComboPooledDataSourceOracle JDBC連接到錯誤的用戶

IOC:春天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_NAME在MY_OLD_SC.MY_TABLE

似乎它甚至連接到錯誤的模式,雖然我證實我連接MY_SC用戶,只有當我從數據庫中刪除MY_OLD_SC後,我才能夠連接到MY_SC。

這個問題並不一致,有時我可以使用不同的schams,但是一旦失敗,我必須刪除數據庫中除我想使用的所有模式外。 大部分時間它發生在我使用impdp的新架構後,但不是隻有在impdp後

請注意,如果我連接到SQL開發者連接到用戶似乎是正確的。

語句創建用戶:爲impdb

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


GRANT conn TO username; 

代碼:

./impdp system/[email protected] remap_schema=org_name:new_name directory=DATA_PUMP_DIR TRANSFORM=oid:n dumpfile=backup.dmp 

將是巨大的,如果你知道可能是什麼問題,也許我需要以不同的方式創建用戶?什麼可能導致這個問題?

感謝廣告

回答

1

我最近用Hibernate 3.3.0有過這個問題。基本上,在驗證過程中運行的Hibernate數據庫元數據掃描程序將獲取與實體定義相匹配的任何表,無論它來自哪個模式,只要它具有對錶定義的讀取訪問權限(不必讀取表訪問權限)。它按字母順序得到它們,所以如果你的實體用於表WIDGET並且你的目標模式是MY_APP_SCHEMA,但ANOTHER_APPS_SCHEMA中有另一個WIDGET,那麼Hibernate將使用ANOTHER_APPS_SCHEMA中的一個來驗證實體。

我在Hibernate的網站上找不到官方的任何東西,但確實找到類似帖子herehere

您可以使用hibernate.default_schema來設置Hibernate使用的模式。

+0

感謝Chris,-Dhibernate.default_schema = MY_USER爲我解決了這個問題。非常奇特的是Hibernate做到了這一點。我正在使用3.6.7。 –

0

有一種更清晰的方法可以將hibernate指向缺省模式 - 在服務器啓動時使用環境屬性。 Java的JVM使用:

-Dhibernate.default_schema=YOUR_SCHEMA 
0

一種解決方案是設置hibernate.default_schema財產,以適應您的用戶(在你的持久單位或ENV財產TomaszZ指出)。

其他解決方案是取消特權以訪問您的用戶的其他模式。這也不應該被允許也是因爲可預見的安全問題(除非該特定用戶需要這種訪問)。