sequence mysql jpa_Java-JPA-生成器-@SequenceGen
即使這個問題非常古老,我還是因?yàn)镴PA 2.0和Oracle序列問題而偶然發(fā)現(xiàn)。
想要分享我對某些事情的研究-
數(shù)據(jù)庫序列定義中GenerationType.SEQUENCE的@SequenceGenerator(allocationSize)與INCREMENT BY之間的關(guān)系
確保將@SequenceGenerator(allocationSize)設(shè)置為與數(shù)據(jù)庫序列定義中的INCREMENT BY相同的值,以避免出現(xiàn)問題(初始值也是如此)。
例如,如果我們在數(shù)據(jù)庫中用INCREMENT BY值定義20的序列,則將SequenceGenerator中的分配大小也設(shè)置為20。在這種情況下,JPA直到到達(dá)下一個20標(biāo)記時才對數(shù)據(jù)庫進(jìn)行調(diào)用,同時每次遞增 內(nèi)部值為1。 這樣可以保存數(shù)據(jù)庫調(diào)用,以便每次獲取下一個序列號。這樣做的副作用是-每當(dāng)重新部署應(yīng)用程序或在兩者之間重新啟動服務(wù)器時,它將調(diào)用數(shù)據(jù)庫以獲取下一批,并且您會看到序列值中的跳轉(zhuǎn)。 另外,我們還需要確保數(shù)據(jù)庫定義和應(yīng)用程序設(shè)置保持同步,因?yàn)檫@兩者都是由不同的組管理的,因此您可能無法始終保持同步,并且您可能會很快失去對它們的控制。 如果數(shù)據(jù)庫值小于分配大小,則將看到由于Id值重復(fù)而導(dǎo)致的PrimaryKey約束錯誤。 如果數(shù)據(jù)庫值大于分配大小,您將看到Id值的跳躍。
如果數(shù)據(jù)庫序列INCREMENT BY設(shè)置為1(這通常是DBA所做的),則將分配大小也設(shè)置為1,以便它們是同步的,但是JPA每次都調(diào)用數(shù)據(jù)庫來獲取下一個序列號。
如果您不想每次都調(diào)用數(shù)據(jù)庫,請使用GenerationType.IDENTITY策略,并由數(shù)據(jù)庫觸發(fā)器設(shè)置@Id值。 使用GenerationType.IDENTITY時,只要調(diào)用em.persist,該對象就會保存到DB,并且將id的值分配給返回的對象,因此我們不必執(zhí)行em.merge或em.flush。 (這可能是JPA提供程序特定的。。不確定)
另一件事-
JPA 2.0自動運(yùn)行ALTER SEQUENCE命令以同步數(shù)據(jù)庫序列中的dispatchSize和INCREMENT BY。 由于大多數(shù)情況下,我們使用不同的模式名稱(應(yīng)用程序用戶名),而不是存在序列的實(shí)際模式,并且應(yīng)用程序用戶名將沒有ALTER SEQUENCE特權(quán),因此您可能會在日志中看到以下警告-
000004c1運(yùn)行時W CWWJP9991W:openjpa運(yùn)行時:警告:無法 緩存序列“ RECORD_ID_SEQ”的序列值。 你的 應(yīng)用程序無權(quán)運(yùn)行ALTER SEQUENCE命令。 確保它具有運(yùn)行ALTER SEQUENCE的適當(dāng)權(quán)限 命令。
由于JPA無法更改序列,因此JPA每次都會調(diào)用數(shù)據(jù)庫以獲取下一個序列號,而不管@ SequenceGenerator.allocationSize的值如何。 這可能是不想要的結(jié)果,我們需要意識到。
要使JPA不運(yùn)行此命令,請?jiān)趐ersistence.xml中設(shè)置此值。 這樣可以確保JPA不會嘗試運(yùn)行ALTER SEQUENCE命令。 雖然它寫了一個不同的警告-
00000094運(yùn)行時W CWWJP9991W:openjpa運(yùn)行時:警告: 屬性“ openjpa.jdbc.DBDictionary = disableAlterSeqenceIncrementBy”是 設(shè)置為true。 這意味著“ ALTER SEQUENCE ... INCREMENT BY” SQL 不會對序列“ RECORD_ID_SEQ”執(zhí)行該語句。 OpenJPA 執(zhí)行此命令以確保序列的INCREMENT BY值 在數(shù)據(jù)庫中定義的匹配于在 實(shí)體的順序。 禁用此SQL語句后, 用戶的責(zé)任,以確保實(shí)體的順序 定義與數(shù)據(jù)庫中定義的序列匹配。
如警告中所述,重要的是我們需要確保數(shù)據(jù)庫序列定義中的@ SequenceGenerator.allocationSize和INCREMENT BY是同步的,包括@SequenceGenerator(allocationSize)的默認(rèn)值50。否則會導(dǎo)致錯誤。
總結(jié)
以上是生活随笔為你收集整理的sequence mysql jpa_Java-JPA-生成器-@SequenceGen的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql原生查询单条数据_原生查询数据
- 下一篇: java 枚举常量_java中的枚举类和