2016-11-23 43 views
0

我想爲每個實體分別自動遞增ID生成器。如何分別使用SQL Server和休眠生成每個表的自動遞增ID

目標數據庫是一個SQL Server數據庫,我使用的是Hibernate 5.2.4.Final。另外我從代碼生成表。

我有一個抽象BaseEntity和其他像下面的子實體,因此,我的目標是TABLE_PER_CLASS

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public abstract class BaseEntity { 
    protected long id; 

    @Id 
    @GeneratedValue(strategy = GenerationType.XXX) 
    @Column(name = "Id") 
    public long getId() { 
     return id; 
    } 
} 

@Entity 
@Table(name = "Tags") 
public class Tag extends BaseEntity { 
} 

下面是我迄今所面臨的不同的方案:

  • 設置XXXAUTO:創建一個hibernate_sequence表在數據庫中,我認爲,將不提供單獨的表不同的ID序列。
  • 設置XXXSEQUENCE:同上。推薦this,同時這樣做。
  • 設置XXXTABLE:創建一個hibernate_sequences表,該表可以爲單獨的表提供單獨的id序列。但是,我發現這是非常昂貴的(與上述參考文獻相同),也不是我的首選策略。
  • 設置XXXTABLE:對TABLE_PER_CLASS不起作用。

我實際上想要使用的是SQL Server的本機標識列。但是,使用SEQUENCE也是一種選擇,但我不確定如何從休眠狀態創建和使用每個表。請建議如何實現這兩者中的任何一個。

由哈利勒M.答案更新我試圖在兩種可能的方式:

  1. 應用上BaseEntity - >不創建爲每個表單獨序列,和而創建ID_SEQNCE,這在保存每個新實體之前查詢。所以,我不確定這與使用GenerationType.TABLE有什麼不同。
  2. 將其應用於每個單獨的實體類 - >在保存時,生成器會創建重複的ID。

回答

0

創建序列使用該

@Id 
    @GeneratedValue(generator = "ID_SEQ", strategy = GenerationType.SEQUENCE) 
    @SequenceGenerator(name = "ID_SEQ", sequenceName = "ID_SEQNCE",allocationSize=1) 

編輯: 你必須自己做,因爲你問在表每班

的不支持ID必須在多個表中共享。因此,當使用此策略的 時,不應使用AUTO或IDENTITY。

更多info

+0

謝謝你的回答。但是,它沒有按預期工作。請查看更新的問題以獲取更多詳細信息。 –

+0

更新了我的答案 –

0

使用策略= GenerationType。IDENTITY

簡單例子是下面

@Id 

@GeneratedValue(strategy = GenerationType.IDENTITY) 

@Column(name = "id", updatable = false, nullable = false) 

private Long id; 

的GenerationType.IDENTITY是最容易使用的,但不是從性能的角度來看最好的一個。它依賴於一個自動遞增的數據庫列,並允許數據庫在每次插入操作時生成一個新值。從數據庫的角度來看,這是非常有效的,因爲自動增量列是高度優化的,並且不需要任何額外的語句。