2013-04-30 11 views
11

Mam pakiet (na przykład packagesToScan) zawierający klasy, które chcę utrwalić z komentarzem @Entity.Zignoruj ​​niektóre klasy podczas skanowania PackagesToScan

Podczas definiowania konfiguracji ApplicationContext wykonałem następujące czynności.


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

} 

Rozwijając, mam jakieś zajęcia w ciągu packagesToScan, która nie spełnia wymagań w zakresie trwałości (jak żaden podstawowych kluczy itp) i ze względu na to, że nie wolno mi się uruchomić test z powodu niepowodzenia konfiguracji ApplicationContext.

Teraz, Czy jest jakiś sposób, że mogę zeskanować tylko wybrane klasy lub zignorować niektóre klasy z zakresu packagesToScan?

+0

Możesz usunąć/skomentować adnotację @Entity, dopóki twoja jednostka nie jest kompletna. Następnie nie zostanie pobrane przez dostawcę uporczywości. –

+0

Czy nie można zeskanować tylko niektórych elementów, z którymi chcę przetestować? – TheKojuEffect

+0

Można także usunąć opcję packagesToScan, utworzyć plik persistence.xml i listę elementów tutaj. Nadal nie rozumiem twojej motywacji do wykluczenia niektórych podmiotów - możesz łatwo usunąć adnotacje @Entity, jeśli jesteś w trakcie rozwoju, a twoja jednostka nie jest kompletna, czy coś mi brakuje? –

Odpowiedz

6

I starali się rozwiązać ten sam problem i wreszcie rozwiązanie jak poniżej:

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

zdałem sobie sprawę, że istnieje setEntityTypeFilters function od klasy LocalSessionFactoryBean które mogą być używane do filtrowania, które zajęcia się w zestawie. W tym przykładzie użyłem RegexPatternTypeFilter, ale są też other types of filters.

Należy również pamiętać, że filtry działają z uwzględnieniem semantyki. Aby przekonwertować semantykę do wykluczenia, musiałem użyć negatywnego uprzedzenia w wyrażeniu regularnym.

W tym przykładzie przedstawiono konfigurację XML, ale konwersja do konfiguracji opartej na języku Java powinna być trywialna.

2

Natknąłem się na podobny problem. Potrzebowałem dodać niektóre, ale nie wszystkie jednostki z paczki. Oto, jak to zrobiłem:

// 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"); 
     } 
    }); 
Powiązane problemy