首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

EasyDBO 輕量持久化框架實戰:單表映射限制下的關聯建模策略

     編輯:Java 相關知識

EasyDBO 定位

  • 超輕量:Jar 極小、API 極簡、上手即用
  • 單表映射:一個領域類對應一張表,**不支持自動關聯持久化** (無 Hibernate 式的 `@OneToMany` 級聯)
  • 兩種用法:實現 `IObject` 接口 (零配置、推薦) 或 `easyjf-dbo.xml` 配置映射

關聯建模核心挑戰

因無自動關聯加載/保存,**關係導航必須在代碼層顯式處理**,且 `IObject` 模式下**領域類不能持有其他領域類引用** (只能持有外鍵 ID)。

三大關聯類型應對策略

一對一

場景策略代價/收益
主表 + 細粒度從表 (如 User + Name)表合併:將 Name 字段併入 User 表避免產生貧血細粒度對象、省去 CRUD 代碼、消除關聯麻煩
大表 + 大表 (如 Order + Payment)外鍵關聯:從表持有主表 ID (或雙向持有 ID)需手工管理關聯一致性、查詢時手工 Join 或兩次查詢

IObject 限制:不能在 `User` 中聲明 `private Name name;`,只能 `private Long nameId;`。

一對多 / 多對一

  • 單向關聯 (推薦):多的一方 (如 `OrderItem`) 持有 `orderId`,提供 `getOrderId()`/`setOrderId()`
  • 雙向關聯:一的一方 (`Order`) 需要 `List` 時,**不能在領域類中聲明**,需創建 `OrderUtil` 類,提供 `List getItems(Long orderId)` 通過 `Query` 手動查詢
  • 避免在 `Order` 中出現 `Set`,否則 `IObject` 模式編譯報錯

多對多

經典案例:`User` ↔ `Role`,中間表 `User_Role`。

策略做法優點缺點
純 SQL 兩層嵌套查詢`UserUtil.getRoles()` 手寫 SQL:`SELECT * FROM Role WHERE id IN (SELECT role_id FROM User_Role WHERE user_id=?)`無額外對象、JDBC 風格熟悉查詢次數多、代碼重複、維護難
中間表建對象 (推薦)創建 `UserRole` 對象映射 `User_Role` 表,冗余字段:`userName`、`roleName`單次查詢獲取豐富信息、模板渲染直接用 `$UserRole.userName`、避免多表 Join冗余數據需同步維護 (應用層保證)

冗余字段原則:僅冗余「頻繁讀取、極少變更、業務關鍵」字段 (如名稱、編碼),避免大文本、頻繁變更字段。

EasyDBO 核心 API 速覽

// 保存/更新 (自動判斷主鍵是否為空)
object.save();

// 刪除
object.delete();

// 主鍵查詢
User user = (User) User.class.getObject(id);

// 條件查詢 (返回 List)
List users = User.query("WHERE username LIKE ?", "%john%");

// 分頁查詢
Page page = User.queryPage("WHERE 1=1", pageNo, pageSize);

// 批量操作
User.delete("WHERE status=?", "INACTIVE");
User.update("SET last_login=?", new Date(), "WHERE id=?", id);

適用性判斷

總結

EasyDBO 以單表映射為核心約束,倒逼開發者在表設計階段就考慮關聯建模代價:合併細粒度表、外鍵 ID 導航、中間表對象化冗余字段。這不是缺陷,而是架構決策的外顯化——適合「表驅動開發、SQL 可控、團隊小、變更快」的輕量級項目。若業務複雜度超過閾值,果斷遷移至 Hibernate/JPA 才是負責任的選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
項目特徵是否適合 EasyDBO
表結構簡單、關聯少、團隊追求極簡✅ 非常適合
複雜領域模型、豐富關聯、需級聯持久化❌ 不適合,選 Hibernate/JPA
舊系統 JDBC 改造、想保留 SQL 控制權✅ 平滑過渡
需要二級緩存、查詢緩存、延遲加載❌ 無此類特性