2016-11-08 71 views
4

我有一個關於Postgres的和GenerationType.Identity VS序列JPA和PostgreSQL與GenerationType.IDENTITY

在這個例子中的問題...

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

我明白,我指定一個Postgres序列使用通過註釋。

但是,我有一個用'serial'類型定義的id列,我已經讀過我可以簡單地使用GenerationType.IDENTITY,它會自動生成一個db序列並使用它來自動遞增。

如果是這種情況,我認爲使用SEQUENCE註釋沒有優勢,除非您使用整數作爲id或有某些特定原因使用您創建的另一個序列。 IDENTITY是更少的代碼,並可能使它跨數據庫移植。

有什麼我失蹤了嗎?

在此先感謝您的反饋意見。

+0

一個在INSERT上生成,另一個不是。一個在PrePersist中是不知道的,另一個是已知的。 –

回答

4

如果你有SERIAL類型的列,這將足以與註釋您id領域:

@Id @GeneratedValue(strategy=GenerationType.IDENTITY) 

這是告訴Hibernate的數據庫將尋找的id柱的後一代。數據庫如何實現自動生成是特定於供應商的,並且可以被認爲是對Hibernate「透明」的。 Hibernate只需要知道插入行後,該行可以以某種方式檢索該行的值爲id

如果使用GenerationType.SEQUENCE,則說明Hibernate數據庫沒有自動填充id列。相反,Hibernate有責任從指定的序列中獲取下一個序列值,並在插入行時使用該值作爲id值。所以Hibernate正在生成並插入id

在Postgres的情況下,碰巧定義一個SERIAL列是通過創建一個序列並將其用作默認列值來實現的。但它是填充id字段的數據庫,因此使用GenerationType.IDENTITY告訴Hibernate數據庫正在處理id生成。

這些引用可以幫助:

http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#identifiers-generators

https://www.postgresql.org/docs/8.1/static/datatype.html#DATATYPE-SERIAL

+0

太好了。謝謝你確認我的理解! – Mike

0

我認爲它可以,如果你使用的是同一順序的一個以上的表是有幫助的(比如你要爲一個唯一的標識符很多類型的賬單)...還如果你想跟蹤序列遠離自動生成的密鑰