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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jpa和hibernate_从JPA到Hibernate的旧版和增强型标识符生成器

發布時間:2023/12/3 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jpa和hibernate_从JPA到Hibernate的旧版和增强型标识符生成器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

jpa和hibernate

JPA標識符生成器

JPA定義了以下標識符策略:

戰略 描述
汽車 持久性提供程序選擇基礎數據庫支持的最合適的標識符策略
身份 標識符由數據庫IDENTITY列分配
序列 持久性提供程序使用數據庫序列來生成標識符
持久性提供程序使用單獨的數據庫表來模擬序列對象

在我以前的文章中,我舉例說明了所有這些替代標識符策略的優缺點。

標識符優化器

盡管沒有太多應用程序端IDENTITY生成器優化(除了配置數據庫標識預分配),但序列標識符在這方面提供了更大的靈活性。 最常見的優化策略之一是基于高/低分配算法 。

為此,Hibernate提供了:

發電機 描述
SequenceHiLoGenerator 它使用數據庫序列生成hi值,而低值根據hi / lo算法遞增

TableHiLoGenerator
數據庫表用于生成hi值。 不推薦使用此生成器,而推薦使用MultipleHiLoPerTableGenerator,增強的TableGenerator或SequenceStyleGenerator。
多重HiLo
PerTableGenerator
它是一個高/低表生成器,即使對于多個標識符序列,也可以使用單個數據庫表。
SequenceStyleGenerator 它是先前序列生成器的增強版本。 如果基礎數據庫支持,則使用序列。 如果當前數據庫不支持序列,它將切換為使用表來生成序列值。 當以前的生成器具有預定義的優化算法時,可以使用優化器策略配置增強型生成器:
  • none :沒有應用優化策略,因此從數據庫中獲取每個標識符
  • hi / lo :它使用原始的hi / lo算法。 這種策略使其他系統難以共享相同的標識符序列,從而要求其他系統實現相同的標識符生成邏輯。
  • pooled :此優化器使用了一個高/低優化策略,但是不是保存當前的高值,而是存儲當前范圍的上邊界(或下邊界– hibernate.id.optimizer.pooled.prefer_lo )。

池化是默認的優化器策略。

表格生成器 與MultipleHiLoPerTableGenerator一樣,它可以將一個表用于多個標識符生成器,??同時提供可配置的優化器策略。

池化是默認的優化器策略。

JPA到Hibernate標識符映射

擁有如此豐富的生成器,我們不禁要問哪個被用作默認的JPA生成器。

盡管JPA規范并不意味著任何特定的優化,但Hibernate寧愿選擇一種優化的生成器,而不是總是為每個新標識符訪問數據庫的優化生成器。

JPA

我們將定義一個配置有SEQUENCE JPA標識符生成器的實體。 單元測試將保留五個這樣的實體。

@Entity(name = "sequenceIdentifier") public static class SequenceIdentifier {@Id@GeneratedValue(generator = "sequence", strategy=GenerationType.SEQUENCE)@SequenceGenerator(name = "sequence", allocationSize = 10)private Long id; }@Test public void testSequenceIdentifierGenerator() {LOGGER.debug("testSequenceIdentifierGenerator");doInTransaction(new TransactionCallable<Void>() {@Overridepublic Void execute(Session session) {for (int i = 0; i < 5; i++) {session.persist(new SequenceIdentifier());}session.flush();return null;}}); }

運行此測試,我們將提供以下輸出

Query:{[call next value for hibernate_sequence][]} Generated identifier: 10, using strategy: org.hibernate.id.SequenceHiLoGenerator Generated identifier: 11, using strategy: org.hibernate.id.SequenceHiLoGenerator Generated identifier: 12, using strategy: org.hibernate.id.SequenceHiLoGenerator Generated identifier: 13, using strategy: org.hibernate.id.SequenceHiLoGenerator Generated identifier: 14, using strategy: org.hibernate.id.SequenceHiLoGenerator Query:{[insert into sequenceIdentifier (id) values (?)][10]} Query:{[insert into sequenceIdentifier (id) values (?)][11]} Query:{[insert into sequenceIdentifier (id) values (?)][12]} Query:{[insert into sequenceIdentifier (id) values (?)][13]} Query:{[insert into sequenceIdentifier (id) values (?)][14]}

Hibernate選擇使用舊的SequenceHiLoGenerator與向后兼容所有在發布增強型生成器之前開發的應用程序。 將舊版應用程序遷移到新生成器上并非易事,因此增強的生成器是新應用程序的更好替代方案。

默認情況下,Hibernate更喜歡使用“ seqhilo”生成器,這不是一個直觀的假設,因為許多人可能期望使用原始的“ sequence”生成器(總是為每個新的標識符值調用數據庫序列)。

為了啟用增強的生成器,我們需要設置以下Hibernate屬性:

properties.put("hibernate.id.new_generator_mappings", "true");

給我們以下輸出:

Query:{[call next value for hibernate_sequence][]} Query:{[call next value for hibernate_sequence][]} Generated identifier: 1, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator Generated identifier: 2, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator Generated identifier: 3, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator Generated identifier: 4, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator Generated identifier: 5, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator Query:{[insert into sequenceIdentifier (id) values (?)][1]} Query:{[insert into sequenceIdentifier (id) values (?)][2]} Query:{[insert into sequenceIdentifier (id) values (?)][3]} Query:{[insert into sequenceIdentifier (id) values (?)][4]} Query:{[insert into sequenceIdentifier (id) values (?)][5]}

新的SequenceStyleGenerator生成的標識符值不同于舊的SequenceHiLoGenerator。 新舊生成器之間的更新語句之所以不同,是因為新生成器的默認優化器策略是“池”的,而舊生成器只能使用“ hi / lo”策略。

JPA

@Entity(name = "tableIdentifier") public static class TableSequenceIdentifier {@Id@GeneratedValue(generator = "table", strategy=GenerationType.TABLE)@TableGenerator(name = "table", allocationSize = 10)private Long id; }

運行以下測試:

@Test public void testTableSequenceIdentifierGenerator() {LOGGER.debug("testTableSequenceIdentifierGenerator");doInTransaction(new TransactionCallable<Void>() {@Overridepublic Void execute(Session session) {for (int i = 0; i < 5; i++) {session.persist(new TableSequenceIdentifier());}session.flush();return null;}}); }

生成以下SQL語句輸出:

Query:{[select sequence_next_hi_value from hibernate_sequences where sequence_name = 'tableIdentifier' for update][]} Query:{[insert into hibernate_sequences(sequence_name, sequence_next_hi_value) values('tableIdentifier', ?)][0]} Query:{[update hibernate_sequences set sequence_next_hi_value = ? where sequence_next_hi_value = ? and sequence_name = 'tableIdentifier'][1,0]} Generated identifier: 1, using strategy: org.hibernate.id.MultipleHiLoPerTableGenerator Generated identifier: 2, using strategy: org.hibernate.id.MultipleHiLoPerTableGenerator Generated identifier: 3, using strategy: org.hibernate.id.MultipleHiLoPerTableGenerator Generated identifier: 4, using strategy: org.hibernate.id.MultipleHiLoPerTableGenerator Generated identifier: 5, using strategy: org.hibernate.id.MultipleHiLoPerTableGenerator Query:{[insert into tableIdentifier (id) values (?)][1]} Query:{[insert into tableIdentifier (id) values (?)][2]} Query:{[insert into tableIdentifier (id) values (?)][3]} Query:{[insert into tableIdentifier (id) values (?)][4]} Query:{[insert into tableIdentifier (id) values (?)][5]}

與前面的SEQUENCE示例一樣,Hibernate使用MultipleHiLoPerTableGenerator來保持向后兼容性。

切換到增強的id生成器:

properties.put("hibernate.id.new_generator_mappings", "true");

給我們以下輸出:

Query:{[select tbl.next_val from hibernate_sequences tbl where tbl.sequence_name=? for update][tableIdentifier]} Query:{[insert into hibernate_sequences (sequence_name, next_val) values (?,?)][tableIdentifier,1]} Query:{[update hibernate_sequences set next_val=? where next_val=? and sequence_name=?][11,1,tableIdentifier]} Query:{[select tbl.next_val from hibernate_sequences tbl where tbl.sequence_name=? for update][tableIdentifier]} Query:{[update hibernate_sequences set next_val=? where next_val=? and sequence_name=?][21,11,tableIdentifier]} Generated identifier: 1, using strategy: org.hibernate.id.enhanced.TableGenerator Generated identifier: 2, using strategy: org.hibernate.id.enhanced.TableGenerator Generated identifier: 3, using strategy: org.hibernate.id.enhanced.TableGenerator Generated identifier: 4, using strategy: org.hibernate.id.enhanced.TableGenerator Generated identifier: 5, using strategy: org.hibernate.id.enhanced.TableGenerator Query:{[insert into tableIdentifier (id) values (?)][1]} Query:{[insert into tableIdentifier (id) values (?)][2]} Query:{[insert into tableIdentifier (id) values (?)][3]} Query:{[insert into tableIdentifier (id) values (?)][4]} Query:{[insert into tableIdentifier (id) values (?)][5]}

您可以看到這次使用了新的增強型TableGenerator 。

有關這些優化策略的更多信息,請閱讀原始發行說明 。

  • 代碼可在GitHub上獲得 。

翻譯自: https://www.javacodegeeks.com/2014/07/from-jpa-to-hibernates-legacy-and-enhanced-identifier-generators.html

jpa和hibernate

總結

以上是生活随笔為你收集整理的jpa和hibernate_从JPA到Hibernate的旧版和增强型标识符生成器的全部內容,希望文章能夠幫你解決所遇到的問題。

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