我有一個需求,我需要同時支持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起作用。
我知道生成器類。我的問題不在於生成器,我的問題是使得hbm文件不兼容以便與Oracle一起使用。如果我刪除它,它會打破PostgreSQL。我知道方言應該處理它,但是,在我的情況下它不是。我不知道爲什麼,需要更多的指針進行調查。 – devang 2012-07-31 15:44:47
寫你自己的idgenerator,它繼承sequencegenerator並根據方言改變序列名稱 – Firo 2012-08-01 06:19:57
順便說一句,這聽起來像一個Hibernate的bug。在這兩種情況下,Hibernate都應該正確引用,你不應該插入你自己的引用。請提交一份Hibernate錯誤報告,序列生成器名稱未正確引用。 – 2012-08-06 00:30:27