2015-07-22 65 views
6

我在我的spring MVC項目中使用了一個MySQL數據庫的hibernate。我已使用@GeneratedValue註釋在我的ID字段上設置自動增量網。所以我所有的實體有這樣的一段代碼,一切都按預期工作:hibernate - 如何在mysql和oracle數據庫中設置自動增量?

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(name = "id") 
private Integer id; 

public Integer getId() { 
    return id; 
} 

public void setId(Integer id) { 
    this.id = id; 
} 

在這個時候,我想切換到Oracle數據庫。現在,我在這裏有兩個問題:

1.什麼是在oracle中設置自動遞增字段的最佳解決方案?我用這個代碼,但不工作:

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_Sequence") 
@SequenceGenerator(name="id_Sequence", allocationSize=1) 

2(更重要的問題)。有沒有什麼辦法可以使用一個獨特的註釋來設置自動增量,可以同時用於MySQL和Oracle

回答

0

1: 如果您定義了自己的生成器,則必須使用@GeneratedValue中的生成器屬性。如果您創建了自己的序列,則必須使用sequenceName來定義名稱,否則hibernate將爲您創建一個名稱。

@SequenceGenerator(name="some_gen", sequenceName="Emp_Seq") 
@GeneratedValue(generator="some_gen") 

2: 最靈活(便攜)的方式是使用TABLE戰略

@GeneratedValue(strategy=GenerationType.TABLE) 

或更明確

@GeneratedValue(generator="some_gen") 
@TableGenerator(name="some_gen", 
    table="ID_GEN", 
    pkColumnName="GEN_NAME", 
    valueColumnName="GEN_VAL") 

這將產生(如果架構生成啓用)表ID_GEN與列GEN_NAME,GEN_VALUE,如果模式生成不可用,則必須自行創建此表。

您從這裏休眠文件找到更完整的信息:http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch05.html#mapping-declaration-id-generator

+0

謝謝您的回答。在第一個建議中不需要使用'strategy = GenerationType.SEQUENCE'? – hamed

+0

我不認爲是因爲你將你的生成器定義爲一個'@ SequenceGenerator'。 –

+0

我把'@SequenceGenerator(name =「some_gen」,sequenceName =「Emp_Seq」) @GeneratedValue(generator =「some_gen」)'超過了我的id,但不工作。另外'@GeneratedValue(strategy = GenerationType.TABLE)'不起作用。 – hamed

相關問題