帶有 Panache 的 Hibernate ORM
1.概述
Hibernate 是最受歡迎的 ORM 框架之一,它提供了豐富的功能,可以簡化對資料庫層的無縫存取。在本教程中,我們將探索一個擴展,以使用 Quarkus 中的 Panache 庫來簡化實體的管理。
2. Quarkus Panache
Panache 是一個 Quarkus 專用函式庫,它簡化了使用 Hibernate 開發持久層的過程。與 Spring Data JPA 類似,Panache 可以幫助我們處理大部分樣板程式碼。 Panache提供了便捷的方法來建立、更新和刪除記錄,執行基本查詢,以及定義自訂儲存庫來管理資料庫層。
要啟動並運行 Panache,我們首先需要添加所需的依賴項,包括Panache本身和資料庫驅動程式。在本文中,我們將使用H2作為資料庫引擎:
<!-- Hibernate ORM specific dependencies -->
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-orm-panache</artifactId>
</dependency>
<!-- JDBC driver dependencies -->
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jdbc-h2</artifactId>
</dependency>
此外,我們需要定義項目的屬性:
quarkus.datasource.db-kind=h2
quarkus.datasource.jdbc.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
quarkus.datasource.username=sa
quarkus.datasource.password=sa
quarkus.hibernate-orm.database.generation=drop-and-create
quarkus.hibernate-orm.log.sql=true
3. 使用PanacheEntity
建立實體
PanacheEntity
是 Quarkus Panache 提供的基類,它提供了在應用程式中管理實體的便捷方法。透過擴展PanacheEntity
,實體會自動繼承id
欄位以及一組內建方法來執行常見操作,例如findAll()
、 findById()
、 persist()
和delete()
。
Panache 透過PanacheEntity
利用 Active Record 模式,透過減少樣板並使程式碼更具表現力,簡化了具有簡單領域模型的專案的開發。
讓我們建立一個映射到文章表的實體:
@Entity
public class Article extends PanacheEntity {
public String title;
public String content;
public Article() {
}
public Article(String title, String content) {
this.title = title;
this.content = content;
}
}
4.執行CRUD操作
現在我們的Article
實體已經設定好了,讓我們來看看如何使用 Panache API 處理常見的 CRUD 操作。我們先從建立新文章開始:
Article article = new Article("Quarkus Panache", "Content of the article");
article.persist();
接下來,我們可以執行讀取操作來從資料庫中檢索資料:
// getting a list of all Article entities
List<Article> allArticles = Article.listAll();
// finding a specific article by ID
article = Article.findById(articleId);
// finding a specific article by ID via an Optional
Optional<Article> optional = Article.findByIdOptional(articleId);
article = optional.orElseThrow(() -> new NotFoundException());
我們還可以取得記錄並套用篩選器以根據特定欄位取得資料:
List<Article> articles = Article.list("title", "Quarkus Panache");
最後,我們可以使用delete
方法從資料庫中刪除記錄:
article.delete();
5. 使用PanacheRepository
進行自訂邏輯
與 Spring Data 類似,我們也可以使用PanacheRepository
透過自訂儲存庫來實現我們自己的邏輯:
@ApplicationScoped
public class ArticleRepository implements PanacheRepository<Article> {
public Article findByTitle(String title) {
return find("title", title).firstResult();
}
public List<Article> findPublished() {
return list("status", "Published");
}
public void deleteDrafts() {
delete("status", "Draft");
}
}
6.測試Panache實體
我們可以利用 Quarkus 的豐富支持,使用@QuarkusTest
測試我們的 Panache 實體:
@QuarkusTest
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class ArticleTest {
@Test
@Transactional
@Order(1)
public void testCreateArticle() {
Article article = new Article("Quarkus Panache", "Content of the article", "Published");
article.persist();
assertNotNull(article.id);
assertEquals(1, Article.count());
}
}
7.最佳實踐
現在,讓我們研究一下使用 Quarkus Panache 時的一些最佳實踐:
7.1. 檢索資料模式
處理簡單用例時,使用 Active Record 模式(擴充PanacheEntity
)來最小化業務邏輯。對於更複雜的場景(例如,分離模組),請使用 Repository 模式(實作PanacheRepository<T>
)。
7.2. PanacheQuery
使用PanacheQuery<T>
實現分頁或排序:
public List<Article> findRecentArticles() {
return find("order by publishedAt desc").page(Page.ofSize(10)).list();
}
7.3. 使用投影
為了獲得更好的性能,我們可以使用帶有投影的自訂查詢來僅檢索我們需要的字段,而不是獲取整個實體:
public List<String> findAllTitles() {
return find("select title from Article").list();
}
8. 結論
在本文中,我們探討了 Quarkus 中的 Panache 擴充及其如何簡化 Hibernate 實體的管理。我們了解了 Panache 如何簡化實體定義以及執行常見操作(例如建立、讀取、更新和刪除記錄)。憑藉對 Active Record 和 Repository 模式的支持,Panache 有助於減少樣板程式碼,並保持持久層的簡潔高效。
像往常一樣,完整的程式碼可以在 GitHub 上找到。