2012-07-27 61 views
0

我有一個需求,我需要同時支持Oracle和PostgreSQL。我有以下休眠映射 -Hibernate:針對Oracle和PostgreSQL的映射

<id name="id" type="java.lang.Integer"> 
    <column name="id" not-null="true" /> 
    <generator class="native"> 
     <param name="sequence">`OneTimeAccessToken_id_seq`</param> 
    </generator> 
</id> 
<property name="resource" type="java.lang.String"> 
    <column name="`res`" not-null="true" /> 
</property> 
<property name="expires" type="long"> 
    <column name="`expires`" not-null="true" /> 
</property> 

但是,這不適用於Oracle,因爲它有反引號。如果我刪除反引號,PostgreSQL會失敗。關於如何爲這兩個數據庫提供支持的任何輸入。

我正在使用org.hibernate.dialect.Oracle10gDialect針對Oracle 11.2版本,那對不對?

我的問題是反引號,並沒有使數據庫的序列兼容。我已經實現了。我在hbm文件中使用了反引號來使PostgreSQL根據我指定的字符情況創建表/列。如果我刪除反引號,PostgreSQL將所有內容翻譯爲小寫。現在使用反引號,PostgreSQL一切正常,但是,它會引起Oracle說的問題它無法找到表或視圖:「OneTimeAccessToken」。我正在嘗試確定如何解決維護表/列名稱案例的這一問題,並使其對Oracle起作用。

回答

2

有這個

<generator class="sequence-identity"> 
    <param name="sequence">OneTimeAccessToken_id_seq</param> 
</generator> 
+0

我知道生成器類。我的問題不在於生成器,我的問題是使得hbm文件不兼容以便與Oracle一起使用。如果我刪除它,它會打破PostgreSQL。我知道方言應該處理它,但是,在我的情況下它不是。我不知道爲什麼,需要更多的指針進行調查。 – devang 2012-07-31 15:44:47

+0

寫你自己的idgenerator,它繼承sequencegenerator並根據方言改變序列名稱 – Firo 2012-08-01 06:19:57

+0

順便說一句,這聽起來像一個Hibernate的bug。在這兩種情況下,Hibernate都應該正確引用,你不應該插入你自己的引用。請提交一份Hibernate錯誤報告,序列生成器名稱未正確引用。 – 2012-08-06 00:30:27

0

你好,我不知道你是否打開基於註釋的配置,但它似乎在this的情況下工作。正如我所看到的,他們只是指定了沒有任何引號的序列的名稱,所以我希望這可以工作,我目前沒有可用的PostgreSQL數據庫(現在只是安裝它),所以我無法運行我的應用程序與它並告訴你肯定,但再次這應該工作。至於你的第二個問題,你可以看到here是的使用Oracle10gDialect版本11應該是OK的。

+0

我沒有搜索過,並得到說Oracle10gDialect罰款的鏈接。但是,我在回覆時遇到問題。我不能移動到使用註釋。我已經意識到序列的事情。 – devang 2012-07-31 15:46:47

0

我不會試圖和相同的SessionFactory內混合數據庫方言專門的發電機。如果你有兩個支持的數據庫,你將不得不使用兩種不同的Hibernate配置。這自然會解決ID生成衝突,因爲您只需使用不同的生成器來處理Oracle域中的類與Postgres域中的類。

+0

我解決了問題。爲了解決ID生成問題,我不需要2種方言,它通過@Firo建議進行更改來解決。其次,爲了解決反向問題,這是Liquibase DB版本工具的一個問題。必須擴展他們的Oracle數據庫實現以覆蓋他們的微不足道的功能,並且還要擴展OracleSnapshotGenerator實現以覆蓋liquibase特定表的表名引用。 – devang 2012-08-06 16:06:47