一直用Hibernate+mysql,感受Hibernate很好用,也出過什麼大問題;這周,公司的產品要部署到Orecle,雖然產品號稱支持Oracle可是我本身知道,這個產品壓根兒就沒在Oracle上測試過,更不要是使用了。因而就開始緊羅密佈的測試了,問題天然一大堆,如今說一個關於主鍵生成策略的問題。mysql
首先,衆所周知,Hibernate能夠自動建表。當咱們把項目部署好,運行的時候發現,確實自動建表了,可是少了不少表,就是有的表生成了,有的表木有生成,這就讓人很頭疼了。一波操做以後,發現Hibernate配置文件中,主鍵生產策略有誤,下面就給你們總結一下當Hibernate遇到oracle以後,主鍵生成策略變化。sql
首先在非集羣狀況下:
能夠使用hibernate自帶的increment策略生成主鍵 ,可是increment 實現機制爲在當前應用實例中維持一個變量,以保存着當前的最大值,以後每次須要生成主鍵的時候將此值加1做爲主鍵。從根原本講,主鍵是在Java虛擬機上產生而不是數據庫產生的,因此increment絕不能在集羣環境下使用。
所以在集羣狀況下:
就必須使用sequence策略。若是採用sequence策略,就必須在oracle數據庫裏面創建序列:數據庫
CREATE SEQUENCE emp_sequence --序列名
INCREMENT BY 1 -- 每次加幾個
START WITH 1 -- 從1開始計數
NOMAXVALUE -- 不設置最大值
NOCYCLE -- 一直累加,不循環
CACHE 10;oracle
固然有的朋友還比較喜歡native這個策略,萬金油嘛;可是要注意了在數據庫是Oracle的時候,若是不懂native的機制,那就麻煩了。怎麼回事呢?若是使用native策略,那麼hibernate會自動調用hibernate_sequence這個序列;若是沒有,那天然就出問題了。因此仍是在oracle數據庫要建立一個名爲hibernate_sequence的序列。有人覺得反正也要創建sequence爲毛要用native啊?不過對於產品化的東西,可能用於多種數據庫的東西仍是有必定使用性的,就不用到每次部署的時候先去改hibernate的配置文件了嘛。測試
好了基本就這樣吧,祝你好運。spa