資料庫事務 ACID 中的 Isolation (隔離性) 依賴鎖機制。無鎖並發會導致:
| 鎖類型 | 別名 | 用途 | 兼容性 |
|---|---|---|---|
| 共享鎖 | S Lock / 讀鎖 | SELECT ... LOCK IN SHARE MODE | S-S 兼容,S-X 互斥 |
| 排他鎖 | X Lock / 寫鎖 | INSERT/UPDATE/DELETE / SELECT ... FOR UPDATE | X 與任何鎖互斥 |
| 更新鎖 | U Lock | 預備更新,防止 S-S 死鎖,升級為 X | U-S 兼容,U-X/U-U 互斥 |
| 維度 | HQL (Hibernate Query Language) | QBC/QBE (Criteria/Example) | Native SQL |
|---|---|---|---|
| 語法風格 | 面向對象,類 SQL | 程序化 API / 示例對象 | 純數據庫 SQL |
| 跨數據庫可移植性 | 高 (Hibernate 翻譯) | 高 | 低 (綁定方言) |
| 動態查詢構建 | 字符串拼接困難 | 極佳 (CriteriaBuilder) | 字符串拼接 |
| 性能調優 | 依賴 Hibernate 生成 SQL,難控制 | 同 HQL | 完全可控,DBA 友好 |
| 類型安全 | 運行時檢查 | 編譯時類型安全 (JPA Criteria) | 無 |
| 適用場景 | 靜態/半靜態查詢、報表 | 複雜動態條件組合、通用查詢頁面 | 複雜報表、存儲過程、特定方言優化、遺留系統 |
// 命名參數、分頁、投影
Query q = session.createQuery("FROM Account a WHERE a.balance > :min ORDER BY a.id DESC");
q.setParameter("min", 100L);
q.setFirstResult(0).setMaxResults(10);
List list = q.list();
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery(Account.class);
Root root = cq.from(Account.class);
cq.where(cb.gt(root.get("balance"), 100L))
.orderBy(cb.desc(root.get("id")));
List list = session.createQuery(cq)
.setFirstResult(0).setMaxResults(10).list();
Account example = new Account();
example.setBalance(100L); // 查詢餘額=100
Example ex = Example.create(example)
.enableLike(MatchMode.ANYWHERE) // 字符串模糊匹配
.excludeZeroes() // 排除基本類型零值
.ignoreCase(); // 忽略大小寫
List list = session.createCriteria(Account.class).add(ex).list();
// 實體映射
List list = session.createSQLQuery(
"SELECT * FROM tb_account WHERE balance > ? ORDER BY id DESC")
.addEntity(Account.class)
.setParameter(0, 100L)
.setFirstResult(0).setMaxResults(10)
.list();
// 純標量/DTO 映射
List
@NamedQuery 集中管理。JOIN FETCH (HQL) 或 EntityGraph (JPA) 預加載。Hibernate 鎖機制定位於事務隔離層:悲觀鎖 (PESSIMISTIC_WRITE) 適用短事務強一致,樂觀鎖 (@Version) 適用長會話高併發。查詢方式上,HQL/JPQL 為主,CriteriaBuilder 處理動態條件,Native SQL 解決疑難性能。理解底層 SQL 生成與鎖行為,結合數據庫隔離級別 (RR/RC),方能構建高併發穩健的持久層。