2013-04-30 155 views
11

我有一個包(如packagesToScan)包含類,我希望堅持註釋@Entity掃描時忽略一些類PackagesToScan

雖然定義ApplicationContext配置,我做了如下。


@Configuration 
@EnableJpaRepositories("packagesToScan") 
@EnableTransactionManagement 
@PropertySource("server/jdbc.properties") 
@ComponentScan("packagesToScan")

public class JpaContext {

... // Other configurations ....

@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); 
    emf.setDataSource(this.dataSource()); 
    emf.setJpaVendorAdapter(this.jpaVendorAdapter()); 
    emf.setPackagesToScan("packagesToScan"); 
    emf.setJpaProperties(this.hibernateProperties()); 
    return emf; 

} 

在發展,我有一些類內packagesToScan不滿足持久性要求(如無主鍵等),由於這個我不能運行由於ApplicationContext安裝失敗而進行測試。

現在, 有什麼方法可以掃描一些選定的類或忽略packagesToScan中的某些類嗎?

+0

您可以刪除/評論@Entity批註,直到您的實體完成。比它不會被持久性提供者拾起。 – 2013-05-08 13:42:43

+0

難道只能掃描一些我想測試的特定實體嗎? – TheKojuEffect 2013-05-08 15:33:30

+0

您也可以在這裏刪除packagesToScan選項,創建persistence.xml並列出實體。我仍然不理解你排除某些實體的動機 - 如果您處於開發過程中並且實體不完整,或者我錯過了某些內容,您可以輕鬆刪除@Entity註釋? – 2013-05-08 17:42:53

回答

6

我一直在試圖解決同樣的問題,終於得到了如下的解決方案:

<bean id="mySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="myDataSource"/> 
    <property name="packagesToScan" value="com.mycompany.bean"/> 
    <property name="entityTypeFilters" ref="packagesToScanIncludeRegexPattern"> 
    </property> 
    <property name="hibernateProperties"> 
     // ... 
    </property> 
</bean> 

<bean id="packagesToScanIncludeRegexPattern" class="org.springframework.core.type.filter.RegexPatternTypeFilter" > 
    <constructor-arg index="0" value="^(?!com.mycompany.bean.Test).*"/> 
</bean> 

我意識到有是可用於過濾是哪些類的LocalSessionFactoryBeansetEntityTypeFilters function包括在內。在這個例子中,我使用了RegexPatternTypeFilter,但也有other types of filters

另請注意,過濾器適用於包含語義。爲了轉換爲排除語義,我必須在正則表達式中使用負向前視。

此示例顯示xml配置,但轉換爲基於java的配置應該很簡單。

2

我偶然發現了一個類似的問題。我需要從包中添加一些但不是全部的實體。以下是我如何做到的:

// add all entities from some package 
localContainerEntityManagerFactoryBean.setPackagesToScan("com.companyname.model"); 
// add only required enitites from a libray 
localContainerEntityManagerFactoryBean.setPersistenceUnitPostProcessors(new PersistenceUnitPostProcessor() { 
     @Override 
     public void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo persistenceUnit) { 
      persistenceUnit.addManagedClassName("com.companyname.common.model.SomeEntityName"); 
     } 
    });