Spring 透過 org.springframework.orm.hibernate3.LocalSessionFactoryBean 完美替代傳統 hibernate.cfg.xml,提供多種靈活的映射檔載入方式。本文詳細比較四種核心屬性的適用場景與最佳實踐。
<property name="mappingResources">
<list>
<value>com/domain/User.hbm.xml</value>
<value>com/domain/Order.hbm.xml</value>
</list>
</property>
優點:配置明確,無歧義
缺點:實體類增加時需手動維護,易遺漏,維護成本高
支援 file:、classpath: 及 Ant 風格通配符:
<property name="mappingLocations">
<list>
<!-- 絕對檔案路徑 -->
<value>file:/WEB-INF/mappings/Order.hbm.xml</value>
<!-- classpath 相對路徑 -->
<value>classpath:com/domain/*.hbm.xml</value>
<!-- 多層目錄通配 -->
<value>classpath:com/**/mappings/*.hbm.xml</value>
</list>
</property>
關鍵差異:* 單層匹配,** 遞歸多層目錄
<property name="mappingDirectoryLocations">
<list>
<value>classpath:com/domain/hbm</value>
<value>file:/WEB-INF/hbm</value>
</list>
</property>
適用於映射檔集中存放、命名規範的場景,自動載入目錄下所有 .hbm.xml
<property name="mappingJarLocations">
<value>file:/lib/domain-mappings.jar</value>
</property>
適合跨專案共享映射定義的企業級應用
| 場景 | 推薦屬性 | 理由 |
|---|---|---|
| 中小型專案,映射檔較少 | mappingResources | 直觀可控 |
| 大型專案,頻繁新增實體 | mappingLocations + 通配符 | 零維護,自動發現 |
| 映射檔獨立模組打包 | mappingJarLocations | 解耦共享 |
| 遷移舊專案,目錄結構固定 | mappingDirectoryLocations | 最小改動 |
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="packagesToScan" value="com.domain"/> <!-- 掃描註解實體 -->
<property name="mappingLocations">
<value>classpath:legacy-mappings/*.hbm.xml</value> <!-- 兼容舊版 XML -->
</property>
</bean>
同時啟用 packagesToScan 與 mappingLocations,實現新舊映射方式平滑共存。