日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

sequence mysql jpa_Java-JPA-生成器-@SequenceGen

發布時間:2025/3/19 数据库 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sequence mysql jpa_Java-JPA-生成器-@SequenceGen 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

即使這個問題非常古老,我還是因為JPA 2.0和Oracle序列問題而偶然發現。

想要分享我對某些事情的研究-

數據庫序列定義中GenerationType.SEQUENCE的@SequenceGenerator(allocationSize)與INCREMENT BY之間的關系

確保將@SequenceGenerator(allocationSize)設置為與數據庫序列定義中的INCREMENT BY相同的值,以避免出現問題(初始值也是如此)。

例如,如果我們在數據庫中用INCREMENT BY值定義20的序列,則將SequenceGenerator中的分配大小也設置為20。在這種情況下,JPA直到到達下一個20標記時才對數據庫進行調用,同時每次遞增 內部值為1。 這樣可以保存數據庫調用,以便每次獲取下一個序列號。這樣做的副作用是-每當重新部署應用程序或在兩者之間重新啟動服務器時,它將調用數據庫以獲取下一批,并且您會看到序列值中的跳轉。 另外,我們還需要確保數據庫定義和應用程序設置保持同步,因為這兩者都是由不同的組管理的,因此您可能無法始終保持同步,并且您可能會很快失去對它們的控制。 如果數據庫值小于分配大小,則將看到由于Id值重復而導致的PrimaryKey約束錯誤。 如果數據庫值大于分配大小,您將看到Id值的跳躍。

如果數據庫序列INCREMENT BY設置為1(這通常是DBA所做的),則將分配大小也設置為1,以便它們是同步的,但是JPA每次都調用數據庫來獲取下一個序列號。

如果您不想每次都調用數據庫,請使用GenerationType.IDENTITY策略,并由數據庫觸發器設置@Id值。 使用GenerationType.IDENTITY時,只要調用em.persist,該對象就會保存到DB,并且將id的值分配給返回的對象,因此我們不必執行em.merge或em.flush。 (這可能是JPA提供程序特定的。。不確定)

另一件事-

JPA 2.0自動運行ALTER SEQUENCE命令以同步數據庫序列中的dispatchSize和INCREMENT BY。 由于大多數情況下,我們使用不同的模式名稱(應用程序用戶名),而不是存在序列的實際模式,并且應用程序用戶名將沒有ALTER SEQUENCE特權,因此您可能會在日志中看到以下警告-

000004c1運行時W CWWJP9991W:openjpa運行時:警告:無法 緩存序列“ RECORD_ID_SEQ”的序列值。 你的 應用程序無權運行ALTER SEQUENCE命令。 確保它具有運行ALTER SEQUENCE的適當權限 命令。

由于JPA無法更改序列,因此JPA每次都會調用數據庫以獲取下一個序列號,而不管@ SequenceGenerator.allocationSize的值如何。 這可能是不想要的結果,我們需要意識到。

要使JPA不運行此命令,請在persistence.xml中設置此值。 這樣可以確保JPA不會嘗試運行ALTER SEQUENCE命令。 雖然它寫了一個不同的警告-

00000094運行時W CWWJP9991W:openjpa運行時:警告: 屬性“ openjpa.jdbc.DBDictionary = disableAlterSeqenceIncrementBy”是 設置為true。 這意味著“ ALTER SEQUENCE ... INCREMENT BY” SQL 不會對序列“ RECORD_ID_SEQ”執行該語句。 OpenJPA 執行此命令以確保序列的INCREMENT BY值 在數據庫中定義的匹配于在 實體的順序。 禁用此SQL語句后, 用戶的責任,以確保實體的順序 定義與數據庫中定義的序列匹配。

如警告中所述,重要的是我們需要確保數據庫序列定義中的@ SequenceGenerator.allocationSize和INCREMENT BY是同步的,包括@SequenceGenerator(allocationSize)的默認值50。否則會導致錯誤。

總結

以上是生活随笔為你收集整理的sequence mysql jpa_Java-JPA-生成器-@SequenceGen的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。