扫描PackagesToScan时忽略某些类

The*_*ect 13 spring spring-data applicationcontext spring-data-jpa

我有一个包(比方说packagesToScan)包含我希望持久注释的类@Entity.

在定义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;

 }
Run Code Online (Sandbox Code Playgroud)

在开发时,我有一些类packagesToScan不满足持久性要求(比如没有主键等),因此我不允许因为ApplicationContext安装失败而运行测试.

现在, 有什么方法可以扫描一些选定的类或忽略其中的一些类packagesToScan

nil*_*gun 8

我一直在努力解决同样的问题,最后得到了如下解决方案:

<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>
Run Code Online (Sandbox Code Playgroud)

我意识到,有一个setEntityTypeFilters功能上的LocalSessionFactoryBean可用于过滤被包括哪些类类.在这个例子中,我使用了RegexPatternTypeFilter,但也有其他类型的过滤器.

另请注意,过滤器使用包含语义.为了转换为排除语义,我必须在正则表达式中使用负向前瞻.

此示例显示了xml配置,但转换为基于java的配置应该很简单.


小智 5

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

// 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");
        }
    });
Run Code Online (Sandbox Code Playgroud)