2010-03-05 57 views
0

我遇到了這個問題,我使用了persistence.xml中的一個屬性,它迫使Hibernate只查看給定模式中的表。使用Oracle的Hibernate bug?

<property name="hibernate.default_schema" value="FOO"/> 

因爲我們現在使用4種不同模式的實際解決方案是產生一個修改persistence.xml 4個war文件。

這不是很優雅。

有誰知道,我怎樣才能配置架構的屬性或通過操縱JDBC連接字符串?

我正在使用Oracle 10g,10_2_3修補程序。

非常感謝。

+4

和bug是... 。? – skaffman 2010-03-05 10:53:04

回答

1

您可以在oracle數據庫上爲四個不同的應用程序創建四個不同的用戶,JDBC連接將包括用戶。

對於用戶,您可以爲表創建同義詞和權限。

E.g.

create or replace synonym USER1.tablename FOR SCHEMA1.tablename; 
create or replace synonym USER2.tablename FOR SCHEMA1.tablename; 
create or replace synonym USER3.tablename FOR SCHEMA2.tablename; 

而當您從休眠狀態訪問表時,將模式關閉。以USER1身份登錄時,它將使用SCHEMA1等。

這樣,您不必使用四個不同的persistence.xml文件創建四個不同的WAR文件。只需用不同的jdbc連接部署應用程序四次。

希望有所幫助。

+0

+1你應該在Oracle空間解決這個問題 – 2010-03-05 19:27:09

1

如果你不想產生四種不同的WAR然後把這個屬性在hibernate.properties文件,並把該文件的類路徑上(但 web應用程序)的每個Web應用程序。

0

我創建了一個名爲deduceSchema的方法,我在設置SessionFactory時運行該方法。它使用數據源打開一個jdbc連接(因爲您還沒有Hibernate會話)並查詢「從dual選擇用戶」以獲取登錄用戶。如果您登錄的用戶也擁有這些表,這將是準確的。如果不是,我使用jndi環境變量來覆蓋。

一旦我有模式,我修改了Hibernate的配置來設置它爲每個表,雖然這僅僅是必要的,如果登錄的用戶是比模式不同:

for (Iterator iter = configuration.getTableMappings(); iter.hasNext();) { 
    Table table = (Table) iter.next(); 
    table.setSchema(schema); 
} 
相關問題