Игнорировать некоторые классы при сканировании PackagesToScan

У меня есть пакет (скажем 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;

 }

код >

Во время разработки у меня есть несколько классов внутри packagesToScan, которые не удовлетворяют требованиям для сохранения (например, никаких первичных ключей и т.д.), и из-за этого мне не разрешено запускать тест из-за ApplicationContext сбоя установки.

Теперь, Есть ли способ, которым я могу сканировать только некоторые выбранные классы или игнорировать некоторые классы в packagesToScan?

Ответ 1

Я пытался решить ту же проблему и, наконец, получил решение, как показано ниже:

<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>

Я понял, что в классе LocalSessionFactoryBean есть функция setEntityTypeFilters, которая может использоваться для фильтрации включенных классов. В этом примере я использовал RegexPatternTypeFilter, но есть другие типы фильтров.

Также обратите внимание, что фильтры работают с include-семантикой. Чтобы преобразовать в исключающую семантику, мне пришлось использовать отрицательный lookahead в регулярном выражении.

В этом примере показана конфигурация 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");
        }
    });