1. 程式人生 > 實用技巧 >【JPA】【筆記】GenerationType四中型別

【JPA】【筆記】GenerationType四中型別

加了nativeQuery = true後,sql為原生sql,不加nativeQuery = true時,baisql語句中from寫的du是entity名稱,zhi加了nativeQuery = true後sql就是原生的dao資料庫中的寫法,from後寫的是表名。要注意的是寫原生態的sql得到的結果如果是model,需要進行轉換,否則會出現轉換異常~

使用springDataJpa自動建立了hibernate_sequence表

解決辦法:

這裡要指定主鍵自增策略,預設是以Oracle的方式來實現自增主鍵。想用mysql的自增方式需要改為@GeneratedValue(strategy=GenerationType.IDENTITY)

把實體類的主鍵生成策略由

>>>>>@GeneratedValue

>>>>> @GeneratedValue(strategy = GenerationTypeType.INDENTY)

JPA提供的四種標準用法為TABLE,SEQUENCE,IDENTITY,AUTO.

TABLE:使用一個特定的資料庫表格來儲存主鍵。
SEQUENCE:根據底層資料庫的序列來生成主鍵,條件是資料庫支援序列。
IDENTITY:主鍵由資料庫自動生成(主要是自動增長型)
AUTO:主鍵由程式控制。

GenerationType.TABLE

使用一個特定的資料庫表格來儲存主鍵,持久化引擎通過關係資料庫的一張特定的表格來生成主鍵,這種策略的好處就是不依賴於外部環境和資料庫的具體實現,在不同資料庫間可以很容易的進行移植,但由於其不能充分利用資料庫的特性,所以不會優先使用。該策略一般與另外一個註解一起使用@TableGenerator,@TableGenerator註解指定了生成主鍵的表(可以在實體類上指定也可以在主鍵欄位或屬性上指定),然後JPA將會根據註解內容自動生成一張表作為序列表(或使用現有的序列表)。如果不指定序列表,則會生成一張預設的序列表,表中的列名也是自動生成,資料庫上會生成一張名為sequence的表(SEQ_NAME,SEQ_COUNT)。序列表一般只包含兩個欄位:第一個欄位是該生成策略的名稱,第二個欄位是該關係表的最大序號,它會隨著資料的插入逐漸累加。

@Id
    @Column(name="id")
    @GeneratedValue(strategy=GenerationType.TABLE,generator="table_gen")
    @TableGenerator(
            name = "table_gen",  
            table="fendo_generator",  
            pkColumnName="seq_name",     //指定主鍵的名字
            pkColumnValue="fendos",      //指定下次插入主鍵時使用預設的值
            valueColumnName="seq_id",    //該主鍵當前所生成的值,它的值將會隨著每次建立累加
            initialValue = 1,            //初始化值
            allocationSize=1             //累加值
            )
    public Integer getUid() {
        return uid;
    }

GenerationType.SEQUENCE

在某些資料庫中,不支援主鍵自增長,比如Oracle,其提供了一種叫做"序列(sequence)"的機制生成主鍵。此時,GenerationType.SEQUENCE就可以作為主鍵生成策略。該策略的不足之處正好與TABLE相反,由於只有部分資料庫(Oracle,PostgreSQL,DB2)支援序列物件,MYsql不支援序列,所以該策略一般不應用於其他資料庫。類似的,該策略一般與另外一個註解一起使用@SequenceGenerator,@SequenceGenerator註解指定了生成主鍵的序列.然後JPA會根據註解內容建立一個序列(或使用一個現有的序列)。如果不指定序列,則會自動生成一個序列SEQ_GEN_SEQUENCE。

@Id  
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="fendo_seq")  
@SequenceGenerator(name="fendo_seq", sequenceName="seq_name")


GenerationType.IDENTITY

此種主鍵生成策略就是通常所說的主鍵自增長,資料庫在插入資料時,會自動給主鍵賦值,比如MySQL可以在建立表時宣告"auto_increment" 來指定主鍵自增長。該策略在大部分資料庫中都提供了支援(指定方法或關鍵字可能不同),但還是有少數資料庫不支援,所以可移植性略差。使用自增長主鍵生成策略是隻需要宣告strategy = GenerationType.IDENTITY即可。

@Id  
@GeneratedValue(strategy = GenerationType.IDENTITY)


GenerationType.AUTO

把主鍵生成策略交給持久化引擎(persistence engine),持久化引擎會根據資料庫在以上三種主鍵生成策略中選擇其中一種。此種主鍵生成策略比較常用,由於JPA預設的生成策略就是GenerationType.AUTO,所以使用此種策略時.可以顯式的指定@GeneratedValue(strategy = GenerationType.AUTO)也可以直接@GeneratedValue。

@Id  
@GeneratedValue(strategy = GenerationType.AUTO)