JPA 以 Annotation 定義實體關聯(@OneToMany、@JoinColumn、cascade 等),看似便利,實則將資料庫結構「硬編碼」進 Java 領域模型。本文剖析三大核心害處:可讀性下降、維護成本激增、複雜關聯建模不實,並呼籲回歸「狀態與行為分離」的 OOP 本質。
三大痛點
- 可讀性崩塌:業務邏輯越複雜,實體類頂部註解越密集,核心領域行為被配置元數據淹沒。
- 維護陷阱:資料庫結構變更(分表、欄位重命名、關聯調整)強制同步修改 Java 代碼並重新編譯部署,違反開閉原則。
- 建模失真:ORM 試圖用物件圖表達關係集合,對多對多、遞迴關聯、複合主鍵等場景往往力不從心,產生畸形物件模型。
本質反思
關係資料庫關心「數據與完整性」(狀態),OOP 關心「物件與行為」(操作)。ORM 試圖忽視狀態抬高操作,卻忘記操作最終必須落地為狀態變更。這也是 ODBMS 從未主流的根本原因。
建議策略
- 簡單 CRUD 專案:JPA 註解可接受
- 核心領域複雜系統:採用 XML 映射檔或手寫 SQL(MyBatis/iBATIS)將持久化邏輯外部化
- 嚴格分離:領域模型零註解,Repository 層封裝持久化細節