1. 程式人生 > >SpringBoot呼叫JpaRepository介面的save方法出錯

SpringBoot呼叫JpaRepository介面的save方法出錯

最近在學習SpringBoot,在呼叫JpaRepository介面的save方法時報錯,如下:在這裡插入圖片描述
一直在想呼叫人家封裝的方法怎麼還會報錯,經過查詢原來是主鍵自增策略的問題
我的程式碼:在這裡插入圖片描述
可以看到JPA的兩個註解@id和@GeneratedValue

@id 標註用於宣告一個實體類的屬性對映為資料庫的主鍵列。

@GeneratedValue 用於標註主鍵的生成策略。(問題就出在這裡)

JPA為開發人員提供了四種主鍵生成策略,被定義在列舉類GenerationType中,包含(TABLE , SEQUENCE , IDENTITY , AUTO).

先介紹下這四種策略:

(1)GenerationType.TABLE

   使用一個特定的資料庫表格來儲存主鍵,持久化引擎通過關係資料庫的一張特定的表格來生成主鍵。

   策略的優點:不依賴於外部環境和資料庫的具體實現,在不同資料庫間可以很容易的進行移植。

   缺點:不能充分利用資料庫的特性,一般不會優先使用。

(2)GenerationType.SEQUENCE

    在某些資料庫中,不支援主鍵自增長,比如Oracle,其提供了一種叫做"系列(sequence)"的機制生成主鍵。

     該策略只要部分資料庫(Oracle/PostgreSQL/DB2)支援序列物件,所以該策略一般不應用與其他資料庫。

(3)GenerationType.IDENTITY

    此種主鍵生成策略就是通常所說的主鍵自增長,資料庫在插入資料時,會自動給主鍵賦值,比如Mysql可以在建立表時宣告"auto_increment"來指定主鍵自增長。大部分資料庫都提供了該支援。

(4)GenerationType.AUTO

    把主鍵生成策略交給持久化引擎,持久化引擎會根據資料庫在以上三種主鍵生成策略中選擇其中一種。因為這種策略比較常用,所以JPA預設的生成策略就是AUTO.

我的程式碼中沒有宣告,預設的AUTO,這種方式如果資料庫中不存在這張表的時候,用它來指定自增方式沒有問題,但是如果資料庫中已經存在這張表並設計了自動方式,那麼插入資料的時候就會報錯。
修改後的程式碼:在這裡插入圖片描述