2015-10-13 93 views
13

目前,我們正在使用MySQL作爲數據庫,我們使用GenerationType.AUTO VS GenerationType.IDENTITY休眠

@Generated Value(strategy = GenerationType.IDENTITY)

它在某些情況下,我們需要把我們的數據庫在那個時候它遷移到Oracle可以正常使用不能正常工作。如果有人知道背後有什麼實際差異以及它是如何工作的?

+0

什麼ORM供應商使用的是? –

+0

Hibernate和JPA –

回答

11

Oracle如何「正常工作」(您沒有定義基本信息,如您的意思)?我沒有看到AUTO對您的問題的相關性 - 只是讓實現選擇它想要使用的。

IDENTITY」(按照JPA javadocs和規範 - 你應該指的是什麼)意思是自動增量。 Oracle中沒有這樣的概念,但在MySQL,SQLServer和其他一些概念中。我希望任何體面的JPA實現在嘗試這樣的事情時都會標記錯誤。

甲骨文將使「SEQUENCE」,或「TABLE」戰略,然而使用

+1

是的,正如你所說,在oracle.but中沒有自動增量選項,但如果我使用GenerationType.AUTO模型正在爲Oracle數據庫工作,因爲如果我給自動JPA根據數據庫自動採取生成的類型。謝謝你的澄清。 –

3

報價Java Persistence/Identity and Sequencing

身份測序使用特殊身份列數據庫允許數據庫在插入行時自動爲對象分配一個id。許多數據庫都支持標識列,例如MySQL,DB2,SQL Server,Sybase和Postgres。 Oracle不支持IDENTITY列,但可以通過使用序列對象和觸發器來模擬它們。

,所以我更喜歡使用SEQUENCE代替

序列對象使用特殊的數據庫對象生成的ID。序列對象僅在某些數據庫(如Oracle,DB2和Postgres)中受支持。通常,SEQUENCE對象具有名稱,INCREMENT和其他數據庫對象設置。每次選擇.NEXTVAL時,序列都會增加INCREMENT。

例子:

@Entity 
public class Employee { 
    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="EMP_SEQ") 
    @SequenceGenerator(name="EMP_SEQ", sequenceName="EMP_SEQ", allocationSize=100) 
    private long id; 
    ... 
}