傳統 Spring 整合 Hibernate 時,需在 LocalSessionFactoryBean 中逐一列出 annotatedClasses,隨著實體類別增加,維護成本極高。Spring 3.1+ 提供 packagesToScan 屬性,自動掃描指定套件下的 @Entity 類別,大幅簡化 XML 配置。
<property name="annotatedClasses">
<list>
<value>com.games.snake.po.game.LvConfigPo</value>
<value>com.games.snake.po.game.BuffPo</value>
<value>com.games.snake.po.game.AwardPo</value>
<!-- 更多實體... -->
</list>
</property>
<property name="packagesToScan" value="cn.o.czcqw.publics.entity" />
<property name="packagesToScan">
<list>
<value>cn.o.czcqw.publics.entity</value>
<value>cn.o.czcqw.party.entity</value>
<value>cn.o.czcqw.society.entity</value>
</list>
</property>
LocalSessionFactoryBean 讀取 packagesToScan。ClassPathScanningCandidateComponentProvider 掃描指定套件及子套件。@Entity、@MappedSuperclass、@Embeddable 的類別。com.xxx.domain),避免掃描過多無關類別影響啟動速度。excludeFilters 排除不需映射的類別。packagesToScan 指向自己的實體套件,避免跨模組掃描。@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sf = new LocalSessionFactoryBean();
sf.setDataSource(dataSource());
sf.setPackagesToScan("cn.o.czcqw.publics.entity", "cn.o.czcqw.party.entity");
sf.setHibernateProperties(hibernateProperties());
return sf;
}