Игнорировать некоторые классы при сканировании 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");
}
});