簡體   English   中英

Hibernate ORM 5 有哪些新功能?

[英]What's new in Hibernate ORM 5?

我剛剛看到 Hibernate 5 的第 4 個候選版本發布了。與早期版本相比,5 中有哪些新內容?

在 Hibernate 5.x 中添加/增強了一些令人興奮的功能。 快看一下。

1.休眠搜索

Hibernate Search 透明地索引您的對象並提供快速的常規、全文和地理定位搜索。 易用性和易於聚類是核心。

  • 實體的全文搜索 -通過近似查找(模糊搜索)
  • 集群友好 -提供多種易於設置的集群策略
  • 分面和地理定位 - 地理定位實體就像@Spatial 一樣簡單

有關 Hibernate Search 的更多詳細信息,請查看此內容。

2. 休眠驗證器

Hibernate Validator 帶有一些內置的驗證規則,如 Email、Length、NotBlank 等。

使用基於注釋的約束以標准化方式表達驗證規則,並受益於與各種框架的透明集成。

有關 Hibernate Validator 的更多詳細信息,請查看此內容。

3. 改進的 Java 8 支持

支持 Java 8 日期/時間數據類型 (JSR 310),並且可以通過 @Past 和 @Future 進行驗證。 通過改進的 ValidatedValueUnwrapper 還支持 Optional 和 JavaFX 類型。

4.休眠OGM

剛剛發布了第一個穩定版本。

5. 引導 API

新的引導 API - 更好的確定性,更好的集成


其他一些事情:

  • 對非 JPA 使用的掃描支持
  • NamingStrategy 已被刪除,以支持設計更好的 API
  • 能夠處理標記為 GenerationType#AUTO 的 id 屬性的其他 Java 類型。 內置支持 Number 和 UUID。 可通過新的 org.hibernate.boot.model.IdGeneratorStrategyInterpreter 擴展進行擴展。
  • 此外,對 AttributeConverters 的支持也得到了擴展和更全面的實現

查看Hibernate ORM 路線圖以獲取更多詳細信息。

在 Hibernate 5 中有一長串改變的東西:

  1. 一個新的引導 API,因此我們可以以編程方式引導 JPA 環境,而無需persistence.xml文件

  2. 從 5.0 開始,Hibernate Spatial 是 Hibernate 項目的一部分,因此我們也可以處理 GIS 數據。

  3. 域模型映射支持Java 8 日期和時間類型 標准 SQL 日期/時間類型與受支持的 Java 8 日期/時間類類型之間的映射如下所示;

    • 日期: java.time.LocalDate
    • 時間: java.time.LocalTimejava.time.OffsetTime
    • 時間戳: java.time.Instantjava.time.LocalDateTimejava.time.OffsetDateTimejava.time.ZonedDateTime
  4. 字節碼增強機制從頭開始重新設計,Hibernate 具有 Maven 和 Gradle 插件。 我們可以通過字節碼檢測增強三個主要方面:

    • 延遲初始化:可以將字段聲明為LAZY並且只有在第一次訪問時才會獲取它們。

    • 臟檢查:實體得到增強,以便它們可以跟蹤在持久性上下文中加載后發生更改的所有屬性。

    • 雙向關聯:可以自動同步雙向關聯的兩側,即使開發人員只更新一側。

  5. Hibernate 的本機 API( Session等)已更新為使用泛型類型。 獲取實體時無需強制轉換。

  6. Hibernate 5.0 將此擴展到更廣泛的類型集(例如UUID )。

  7. 二級緩存引用。 此功能支持將實體引用直接存儲到不可變實體的二級緩存中。

  8. 從 Hibernate 5.0 開始,我們有一個從頭開始編寫的全新用戶指南

Hibernate 5.1添加了以下功能:

  1. 您現在可以在 JPQL 和 HQL 查詢中加入不相關的實體
  2. 通過標識符加載多實體

Hibernate 5.2添加了以下支持:

  1. Java 1.8,因此您現在可以使用Query.stream()
  2. Hibernate Session擴展了EntityManager因此您可以直接從Session訪問所有 J​​PA 方法
  3. 支持 JCache
  4. 會話級批量大小
  5. TimestampTime全球時區設置(例如 UTC)
  6. 獨特的直通提示
  7. 更高效的 JPQL 和 HQL 解析常量值
  8. hibernate.connection.provider_disables_autocommit資源本地事務優化
  9. 更好地處理 Criteria API 文字

Hibernate 5有5個新功能

1.支持Date和Time API的類作為BasicTypes新的Date和Time API是Java 8中最令人期待的變化之一。舊的java.util.Date有很多問題最終得到修復。

不幸的是,JPA 2.1和Hibernate 4不提供直接支持。 但這不是一個大問題。 只需幾行代碼即可實現映射LocalDate的AttributeConverter。

但顯然,作為BasicType的顯式支持仍然好多了。 Hibernate在5.0版中實現了這一點。 從那時起,您不需要任何其他注釋或轉換器來保留Date和Time API的類。 您可以使用與任何其他受支持的屬性類型相同的方式使用它們。

2.以流的形式獲取查詢結果引入一種新方法,為您提供查詢結果,因為Stream聽起來不是一件大事。 但是Hibernate的Query接口的stream方法提供了額外的好處,使得它對於巨大的結果集特別有趣。 它以多個批次獲取結果集,並使用Hibernate的ScrollableResults實現滾動它。 如果您使用Stream逐個處理結果集記錄並幫助您有效地實現用例,則此方法非常適合。

您可以使用自Hibernate 5.2以來的新方法來獲取查詢結果。 以下代碼片段顯示了一個簡單示例,該示例從數據庫中選擇所有Book實體並將其作為Stream處理。

3.通過主鍵獲取多個實體

通過ID獲取多個實體是一個非常常見的用例。 大多數開發人員要么使用循環來實現它,該循環為每個主鍵調用EntityManager的find方法,要么使用JPQL查詢來檢查IN子句中的所有主鍵值。 第一個選項要求Hibernate為每個主鍵執行數據庫查詢。 這可能會產生巨大的性能問題。 第二個允許您使用一個查詢獲取所有實體,顯然是更好的選擇。

Hibernate 5.1引入了第三個選項,它避免了第一個問題,並且比第二個選項更容易使用。 新的MultiIdentifierLoadAccess接口提供了一個舒適的選項,可以通過一個查詢加載多個實體。 您只需要在Hibernate Session上調用byMultipleIds方法以獲取MultiIdentifierLoadAccess接口,並為multiLoad方法提供主鍵值列表。 Hibernate的實現還提供了額外的優勢:它將大量主鍵值列表分成多個批次。 這有時是必需的,因為某些數據庫限制了IN子句中的元素數量。

4.在查詢中加入未關聯的實體

您可以輕松地在JPQL查詢中加入實體之間的映射關聯。 映射已提供所需的連接條件,您無需在查詢中提供它們。

但是,映射關聯數據庫表但沒有映射關聯的實體呢?

這不是一個修辭問題。

大多數實體模型都沒有映射所有可能的關聯。 它們只映射那些似乎在域模型中提供價值的映射,而不是映射2個數據庫表(看似偶然)存儲相同外鍵的映射。 它經常發生在許多方面與許多記錄的多對多關聯不會與Hibernate映射。 有人調用關聯的getter並獲取數百或數千個實體的風險太高了。

只要你看一下領域模型,這就完全沒問題了。 您可能在模型中不需要這些關聯。 但這並不意味着您在其中一個JPQL查詢中不需要它們。

如果是這種情況,您有3個選擇:

1模擬實體之間的關聯或
2在JPQL查詢中使用交叉連接,這可能會導致性能問題或
3使用Hibernate專有的JOIN子句。 我更喜歡選項3.這是最簡單,最自然的選擇。

從Hibernate 5.1開始,您可以使用類似SQL的語法來連接實體,而無需建模關聯。

5. @Repeatable注釋

可重復注釋是Java 8中較小的更改之一。它允許您多次使用相同注釋注釋類,屬性或接口。 您想要執行此操作的典型JPA示例是為實體定義多個命名查詢。

到目前為止,您必須使用@NamedQueries注釋來注釋您的實體,該注釋包含@NamedQuery注釋數組。 令人討厭的是@NamedQueries注釋只是一個容器。 它本身不提供任何價值。 從Hibernate 5.2開始,您不必再這樣做了。 至少不要只要使用Hibernate的org.hibernate.annotations.NamedQuery注釋版本。 @NamedQuery和許多其他Hibernate注釋現在都是可重復的,可以多次分配。 正如您在下面的代碼片段中所看到的,這使得代碼更易於閱讀並且使用起來更加舒適。

Creadit /來源https//www.thoughts-on-java.org/5-new-features-hibernate-5-every-developer-know/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM