在Struts+Hibernate架構中,直接將Hibernate PO傳遞給JSP是嚴重設計錯誤。各層應有獨立數據表示,通過邊界轉換實現解耦。
| 層 | 數據表示 | 來源 | 邊界 |
|---|---|---|---|
| Web層 | FormBean (ActionForm) | HTML Form POST | Action |
| 業務層 | VO (Value Object) | 業務邏輯組裝 | Service/DAO接口 |
| 持久層 | PO (Persistent Object) | 數據庫映射 | DAO實現內部 |
Hibernate PO脫離Session仍保持狀態,可直接充當VO,減少PO↔VO轉換代碼。但絕不能穿透到Web層View。
字段一一對應,誤以為可合一 → 實則埋下隱患。
name嵌入對象、roles集合、posts集合)JSP(View) → FormBean → Action(Control) → [轉換] → PO/VO → Business Bean → DAO → ORM → DB
↑
轉換邊界在Action
RegisterFormBeanUserPO(含Name值對象)UserService.register(UserPO)UserNameFormBean(3字段)Name值對象 → 調用UserService.findByName(Name)UserPO(含集合屬性)UserFormBean → request.setAttributeJDO PO無法脫離持久層,業務層必須用VO,導致大量PO↔VO轉換樣板代碼。Hibernate此點優勢顯著。