手頭上的項目現在需要遷移到oracle9i上,原先用的是postgresql,用了幾天的時間遷移成功了,記錄一下遷移過程:
1、首先要知道oracle和postgresql某些類型的區別:
postgresql --> oracle:
----------------------------
text -->clob
bigint --> numvber(38)
boolean --> CHAR(1),用T,F來表示,也可以用number(1),用0和1表示.我這裡採用的是CHAR(1)
2、下面是建表要注意的事項:
2.1、在oracle中,number、commnet等是關鍵字,注意在建表的sql語句中要加上雙引號。
2.2、alter table時沒有ONLY選項。
2.3、沒有串聯更新: ON UPDATE CASCADE。
2.4、約束條件名稱不能相同。
2.5、如果需要用到別名,在欄位後面可以用as,但注意表名後面不要加as!
3、這次資料庫遷移的一個要求是:在不改動原先程式的前提下,只通過改動設定檔和資料庫結構來完成遷移工作。該系統的主要架構是J2EE+SSH+Tomcat+Postgresql。原型通過hibernte來映射的實體類中有不少是java的boolean類型,而oracle沒有boolean類型,這就需要通過hibernate來對布爾類型進行映射了。
首先把建表語句從postgresql匯出來,然後根據前面提到的注意點進行修改,在oracle中建立好表。
4、通過hibernate來對boolean類型進行映射:
4.1在實體類的對應檔中,把boolean或java.lang.Boolean類型改為true_false,如:
<property name="isDefault" type="true_false" column="is_default" not-null="true" length="1" > <meta attribute="use-in-tostring">true</meta> <meta attribute="use-in-equals">true</meta> <meta attribute="field-description"> @hibernate.property column="is_default" length="1" type="true_false" </meta> </property>
4.2 在hibernate的屬性設定檔中配置hibernate.query.substitutions選項:如:
<property name="hibernateProperties"> <props> <!-- <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>--> <prop key="hibernate.dialect">${hibernate.connection.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.connection.show_sql}</prop> <prop key="hibernate.format_sql">true</prop> <!-- 為相容oracle,讓hibernate自動對T/F和true/false進行轉換,資料庫欄位為CHAR(1)類型 , 在hibernate的對應檔中用type="true_false"--> <prop key="hibernate.query.substitutions">true 'T',false 'F'</prop><!-- 如果資料庫用 MS SQLServer,此屬性要設為false,否則系統啟動時會拋出異常:Unsupported method:ResultSet.absolute 如果支援scrollable result,使用ResultSet的absolute方法直接移到查詢起點,沒有額外效能開銷,如果不支援的話,使用迴圈語句,rs.next一點點的移過去。 --> <prop key="hibernate.jdbc.use_scrollable_resultset">true</prop> </props> </property>
這樣就差不多把表結構遷移了,至於匯入資料這裡就不說了,主要注意的是有主從關係的資料表匯入的順序。