標籤:多表 -- with 策略 span 運行 計數 cycle 操作
一直用Hibernate+mysql,感覺Hibernate很好用,也出過什麼大問題;這周,公司的產品要部署到Orecle,雖然產品號稱支援Oracle但是我自己知道,這個產品壓根兒就沒在Oracle上測試過,更不要是使用了。於是就開始緊羅密布的測試了,問題自然一大堆,現在說一個關於主鍵建置原則的問題。
首先,眾所周知,Hibernate可以自動建表。當我們把項目部署好,啟動並執行時候發現,確實自動建表了,但是少了很多表,就是有的表產生了,有的表木有產生,這就讓人很頭疼了。一波操作之後,發現Hibernate設定檔中,主鍵生產策略有誤,下面就給大家總結一下當Hibernate遇到oracle之後,主鍵建置原則變化。
首先在非叢集情況下:
可以使用hibernate內建的increment策略產生主鍵 ,但是increment 實現機製為在當前應用執行個體中維持一個變數,以儲存著當前的最大值,之後每次需要產生主鍵的時候將此值加1作為主鍵。從根本來講,主鍵是在Java虛擬機器上產生而不是資料庫產生的,所以increment絕不能在叢集環境下使用。
因此在叢集情況下:
就必須使用sequence策略。如果採用sequence策略,就必須在oracle資料庫裡面創建序列:
CREATE SEQUENCE emp_sequence --序列名
INCREMENT BY 1 -- 每次加幾個
START WITH 1 -- 從1開始計數
NOMAXVALUE -- 不設定最大值
NOCYCLE -- 一直累加,不迴圈
CACHE 10;
當然有的朋友還比較喜歡native這個策略,萬金油嘛;但是要注意了在資料庫是Oracle的時候,如果不懂native的機制,那就麻煩了。怎麼回事呢?如果使用native策略,那麼hibernate會自動調用hibernate_sequence這個序列;如果沒有,那自然就出問題了。所以還是在oracle資料庫要建立一個名為hibernate_sequence的序列。有人以為反正也要建立sequence為毛要用native啊?不過對於產品化的東西,可能用於多種資料庫的東西還是有一定使用性的,就不用到每次部署的時候先去改hibernate的設定檔了嘛。
好了基本就這樣吧,祝你好運。
Hibernate遇到oracle之主鍵建置原則