[英]What's new in Hibernate ORM 5?
我剛剛看到 Hibernate 5 的第 4 個候選版本發布了。與早期版本相比,5 中有哪些新內容?
在 Hibernate 5.x 中添加/增強了一些令人興奮的功能。 快看一下。
Hibernate Search 透明地索引您的對象並提供快速的常規、全文和地理定位搜索。 易用性和易於聚類是核心。
有關 Hibernate Search 的更多詳細信息,請查看此內容。
Hibernate Validator 帶有一些內置的驗證規則,如 Email、Length、NotBlank 等。
使用基於注釋的約束以標准化方式表達驗證規則,並受益於與各種框架的透明集成。
有關 Hibernate Validator 的更多詳細信息,請查看此內容。
支持 Java 8 日期/時間數據類型 (JSR 310),並且可以通過 @Past 和 @Future 進行驗證。 通過改進的 ValidatedValueUnwrapper 還支持 Optional 和 JavaFX 類型。
剛剛發布了第一個穩定版本。
新的引導 API - 更好的確定性,更好的集成
其他一些事情:
查看Hibernate ORM 路線圖以獲取更多詳細信息。
在 Hibernate 5 中有一長串改變的東西:
一個新的引導 API,因此我們可以以編程方式引導 JPA 環境,而無需persistence.xml
文件。
從 5.0 開始,Hibernate Spatial 是 Hibernate 項目的一部分,因此我們也可以處理 GIS 數據。
域模型映射支持Java 8 日期和時間類型。 標准 SQL 日期/時間類型與受支持的 Java 8 日期/時間類類型之間的映射如下所示;
java.time.LocalDate
java.time.LocalTime
, java.time.OffsetTime
java.time.Instant
、 java.time.LocalDateTime
、 java.time.OffsetDateTime
和java.time.ZonedDateTime
字節碼增強機制從頭開始重新設計,Hibernate 具有 Maven 和 Gradle 插件。 我們可以通過字節碼檢測增強三個主要方面:
延遲初始化:可以將字段聲明為LAZY
並且只有在第一次訪問時才會獲取它們。
臟檢查:實體得到增強,以便它們可以跟蹤在持久性上下文中加載后發生更改的所有屬性。
雙向關聯:可以自動同步雙向關聯的兩側,即使開發人員只更新一側。
Hibernate 的本機 API( Session
等)已更新為使用泛型類型。 獲取實體時無需強制轉換。
Hibernate 5.0 將此擴展到更廣泛的類型集(例如UUID
)。
二級緩存引用。 此功能支持將實體引用直接存儲到不可變實體的二級緩存中。
從 Hibernate 5.0 開始,我們有一個從頭開始編寫的全新用戶指南。
Hibernate 5.1添加了以下功能:
Hibernate 5.2添加了以下支持:
Query.stream()
Session
擴展了EntityManager
因此您可以直接從Session
訪問所有 JPA 方法Timestamp
和Time
全球時區設置(例如 UTC)hibernate.connection.provider_disables_autocommit
資源本地事務優化。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.