不寫 User.java,直接用 Map<String, Object> 承載資料,映射檔以 entity-name 識別實體。
<class entity-name="..."><class entity-name="com.hb3.pack_06.model.DynamicUserModel" table="user">
<id name="id" column="id" type="java.lang.Integer">
<generator class="native"/>
</id>
<property name="name" column="name" type="java.lang.String"/>
<property name="age" column="age" type="java.lang.Integer"/>
</class>
entity-name:唯一識別符,取代類別全名,不可重複。name 屬性對應 Map 的 Key。Map<String, Object> userMap = new HashMap<>();
userMap.put("name", "shenbin");
userMap.put("age", 28);
session.save("com.hb3.pack_06.model.DynamicUserModel", userMap);
userMap = (Map) session.load(
"com.hb3.pack_06.model.DynamicUserModel", 1);
System.out.println(userMap.get("name"));
System.out.println(userMap.get("age"));
Query q = session.createQuery("from com.hb3.pack_06.model.DynamicUserModel");
List<Map> list = q.list(); // 回傳 List
Map 的 Value 可以是另一個 Map(多對一)、List<Map>(一對多)等,映射檔同樣用 entity-name 參考。
| 優點 | 缺點 |
|---|---|
| 無需編譯 Java 類別,熱部署友善 | 失去型別安全,編譯期無法發現拼字錯誤 |
| 適合高度動態的資料結構 | IDE 自動完成、重構支援缺失 |
| 減少樣板代碼 | 效能略低於 POJO(反射/Map 操作開銷) |
| 可與 POJO 混用 | 除錯困難,堆疊追蹤無類別名 |
**僅在原型階段或極度動態場景使用**。正式專案建議轉為 POJO + 映射檔/註解,獲得型別安全與維護性。