扫描时忽略一些类PackagesToScan

扫描时忽略一些类PackagesToScan

问题描述:

我有一个包(如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

我一直在试图解决同样的问题,终于得到了如下的解决方案:

<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的配置应该很简单。

我偶然发现了一个类似的问题。我需要从包中添加一些但不是全部的实体。以下是我如何做到的:

// 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"); 
     } 
    });