專案名稱從 Hibernate Types 變更為 Hypersistence Utils,因為專案的範圍現在更廣泛,也提供 Spring 實用程式。
因此,從 Hibernate Types 2.x 遷移到 Hypersistence Utils 3.x 時,您需要執行下列步驟:
com.vladmihalcea.hibernate
更改為io.hypersistence.utils.hibernate
。com.vladmihalcea.spring
更改為io.hypersistence.utils.spring
。就是這樣!
Hypersistence Utils 專案為您提供了適用於 Spring 和 Hibernate 的通用實用程式。
該專案的主要優點是它支援廣泛的 Hibernate 版本,從 Hibernate ORM 6.6 、 6.5 、 6.4 、 6.3到6.2 、 6.1 、 6.0 、 5.6和 Hibernate 5.5 。
根據您使用的 Hibernate 版本,您需要新增以下相依性:
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-63</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-62</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-60</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-55</artifactId>
<version>3.9.0</version>
</dependency>
Hypersistence Utils 專案定義了一系列可選依賴項,您必須在專案中明確聲明這些依賴項才能使用它們。
所有這些依賴項(如 Guava、Jackson 或 PostgreSQL JDBC Driver)都是可選的,原因是並非所有專案都需要它們。
此外,依賴版本非常重要,因為有時可能會發現安全性問題,並在新版本中修復。
因此,依賴這個函式庫為您提供依賴版本是一件非常危險的事情。
例如,在該專案嚴重依賴的 Jackson Data Bind 庫中發現了 65 個安全問題。
為了避免安全問題,您需要負責不斷升級與 Hypersistence Utils 程式庫一起使用的所有相依性。
如果您使用 JSON 類型,那麼您可能有興趣根據您的 Hibernate 版本設定以下依賴項:
< dependency >
< groupId >com.fasterxml.jackson.module</ groupId >
< artifactId >jackson-module-jakarta-xmlbind-annotations</ artifactId >
< version >${jackson-module-jakarta-xmlbind-annotation}</ version >
</ dependency >
< dependency >
< groupId >com.fasterxml.jackson.core</ groupId >
< artifactId >jackson-databind</ artifactId >
< version >${jackson-databind.version}</ version >
</ dependency >
< dependency >
< groupId >com.fasterxml.jackson.module</ groupId >
< artifactId >jackson-module-jaxb-annotations</ artifactId >
< version >${jackson-module-jaxb-annotation}</ version >
</ dependency >
如果您使用 Guava 映射Range
,則必須明確提供 Guava 依賴項:
< dependency >
< groupId >com.google.guava</ groupId >
< artifactId >guava</ artifactId >
< version >${guava.version}</ version >
</ dependency >
如果您要對應MonetaryAmount
,則必須明確提供 Moneta 依賴項:
< dependency >
< groupId >org.javamoney</ groupId >
< artifactId >moneta</ artifactId >
< version >${moneta.version}</ version >
< type >pom</ type >
</ dependency >
如果您要對應 PostgreSQL 特定的欄位類型(例如inet
、 hstore
、 array
、 interval
),那麼您必須明確提供 PostgreSQL 依賴項:
< dependency >
< groupId >org.postgresql</ groupId >
< artifactId >postgresql</ artifactId >
< version >${postgresql.version}</ version >
</ dependency >
JsonType
可讓您對應 JSON 列類型,無論您使用的是 Oracle、SQL Server、PostgreSQL 還是 MySQL。
如果您使用 Hibernate 6,則可以將任何 JSON 欄位對應到Map
、 List
、 POJO、 String
或JsonNode
實體屬性:
@ Type ( JsonType . class )
private Map < String , String > properties = new HashMap <>();
如果您使用 Hibernate 5,您可以提供 Hibernate 類型的完全限定名稱:
@Type(type = "io.hypersistence.utils.hibernate.type.json.JsonType")
或者,您可以將以下映射新增至 JPA 實體所在的相同套件中的package-info.java
類別:
@ TypeDef (
name = "json" , typeClass = JsonType . class
)
package io . hypersistence . optimizer ;
import io . hypersistence . utils . hibernate . type . json . JsonType ;
import org . hibernate . annotations . TypeDef ;
稍後,您可以將Map
、 List
、 POJO、 String
或JsonNode
實體屬性對應到 JSON 列,如下所示:
@ Type ( type = "json" )
private Map < String , String > properties = new HashMap <>();
有關更多詳細信息,請查看這篇文章。
將 JSON 列類型對應到
POJO
、List<POJO>
或Map<String, POJO>
時,需要確保POJO
類型覆寫預設的equals
和hashCode
方法並根據 JSON 物件內容實作它們。否則,Hibernate髒檢查機制可能會觸發意外的UPDATE語句。查看#134 問題以了解更多詳細資訊。
使用 Oracle 時,您有多種選擇:
JSON
、 VARCHAR
或BLOB
列類型一起使用的通用JsonType
,只要您使用 JPA @Column
註解的columnDefinition
屬性提示列類型即可。JsonStringType
來對應儲存 JSON 的VARCHAR2
列類型。JsonBlobType
來對應儲存 JSON BLOB
欄位類型。有關更多詳細信息,請查看這篇文章。
使用 SQL Server 時,可以使用通用JsonType
或JsonStringType
來對應儲存 JSON 的NVARCHAR
欄位類型。
有關更多詳細信息,請查看這篇文章。
使用 PostgreSQL 時,可以使用通用JsonType
或JsonBinaryType
來對應jsonb
和json
列類型。
有關更多詳細信息,請查看這篇文章。
使用 MySQL 時,可以使用通用JsonType
或JsonStringType
來對應json
列類型。
有關更多詳細信息,請查看這篇文章。
JsonNode
對應到 JSON 列No Dialect mapping for JDBC type: 1111
問題column is of type jsonb but expression is of type record
或bytea
類型的問題List
Duration
MonetaryAmount
的最佳方式java.time.YearMonth
對應到 DATE 或 INTEGER 列java.time.Year
和java.time.Month
Character
到可為空的 CHAR 列UserType
實作的ImmutableType
實用程式findAll
反模式@Retry
註解在失敗時自動重試BaseJpaRepository
是預設 Spring Data JpaRepository
的更好替代方案,因為它不提供在 JPA 術語中沒有意義的findAll
方法或save
方法。
若要使用BaseJpaRepository
實用程序,請確保在@EnableJpaRepositories
配置中提供repositoryBaseClass
屬性,以引用 Hypersistence Utils 專案中的BaseJpaRepositoryImpl
:
@ Configuration
@ EnableJpaRepositories (
value = "your.repository.package" ,
repositoryBaseClass = BaseJpaRepositoryImpl . class
)
public class JpaConfiguration {
...
}
your.repository.package
是 Spring 儲存庫的 Java 套件。
雖然BaseJpaRepository
是首選,但如果您需要使用預設的JpaRepository
,那麼您至少也可以擴展HibernateRepository
以棄用可能導致問題的方法。
若要使用HibernateRepository
,請確保在@EnableJpaRepositories
配置中包含io.hypersistence.utils.spring.repository
套件:
@ Configuration
@ EnableJpaRepositories (
value = {
"io.hypersistence.utils.spring.repository" ,
"your.repository.package" ,
...
}
)
public class JpaConfiguration {
...
}
your.repository.package
是 Spring 儲存庫的 Java 套件。
BatchSequenceGenerator
- Hibernate 批次序列產生器CamelCaseToSnakeCaseNamingStrategy
- 如何使用 Hibernate 將camelCase屬性對應到snake_case列名稱ClassImportIntegrator
- 如何使用 JPA 編寫緊湊的 DTO 投影查詢ListResultTransformer
- 使用 Hibernate ResultTransformer 的最佳方法MapResultTransformer
- 如何從 JPA 或 Hibernate 查詢傳回 Map 結果SQLStatementCountValidator
- 如何在測試過程中偵測 Hibernate N+1 查詢問題SQLExtract
- 如何從 JPQL 或 JPA Criteria 取得 SQL 查詢QueryStackTraceLogger
- 如何找到 Hibernate 產生的 SQL 查詢的來源這個項目是免費的,就像 Libre 一樣,而不是免費的。
不提供免費支援。只有原始碼和二進位是免費提供的。
如果您在特定問題上需要協助,您需要購買 Coaching Basic 或 Coaching Pro 方案。
除了付費支援選項之外,您還可以選擇提供自己的修復。為此,您需要執行以下操作:
不過,由於時間不夠,我會不時審核提交的 Pull Request,因此您可能需要等待幾個月才能審核並整合 Pull Request。
想像一下,有一個工具可以自動偵測您是否正確使用 JPA 和 Hibernate。不再有效能問題,不再需要花費無數時間試圖找出應用程式幾乎無法爬行的原因。
想像一下,在開發週期的早期發現您正在使用次優的映射和實體關係,或者您缺少與效能相關的設定。
此外,透過 Hypersistence Optimizer,您可以在測試期間偵測所有此類問題,並確保不會將影響資料存取層效能的變更部署到生產環境。
Hypersistence Optimizer 是您期待已久的工具!
如果您對現場培訓感興趣,我可以為您提供高效能 Java 持久性培訓,可以調整為一天、兩天或三天的課程。欲了解更多詳情,請查看我的網站。
如果您希望我審查您的應用程式並深入了解如何優化它以使其運行得更快,請查看我的諮詢頁面。
如果您想以最快的方式學習如何加速 Java 資料庫應用程序,那麼您絕對應該參加我的高效能 Java 持久性影片課程。
或者,如果您更喜歡閱讀書籍,您也會喜歡我的《高效能 Java 持久性》一書。
這個專案使用 Maven 工具鏈,因為不同的模組使用不同的 Java 版本進行編譯和測試。
Hypersistence Utils 6 需要 Java 11,而其他模組則使用 Java 8 編譯。
若要了解如何設定 Maven 工具鏈,請查看這篇文章。
此專案使用各種資料庫系統進行整合測試,您可以使用DatasourceProvider
實例(例如PostgreSQLDataSourceProvider
)配置 JDBC 連線設置,並且該專案使用 Testcontainers 來引導具有所需 Oracle、SQL Server、PostgreSQL 或 MySQL 的 Docker 容器按需執行個體。
如果您是定期貢獻者,建議在本地設定所需的資料庫或使用
docker
資料夾中提供的 Docker Compose 配置,因為按需引導容器速度較慢,並且您的測試將需要更長的時間來運行。
如果您想解決問題或添加對新功能的支持,請提供相關的整合測試案例,以證明改進正在按預期工作。