2013-04-30 13 views
11

Ho un pacchetto (ad esempio packagesToScan) contenente le classi che desidero persistere annotato con @Entity.Ignora alcune classi durante la scansione di PackagesToScan

Durante la definizione della configurazione di ApplicationContext, ho eseguito quanto segue.


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

} 

Durante lo sviluppo, ho alcune classi all'interno packagesToScan che non soddisfano i requisiti per la persistenza (come nessun chiavi primarie, ecc) e per questo io non sono autorizzato a correre test a causa di errore di installazione ApplicationContext.

Ora, C'è un modo che è possibile scansionare solo alcune classi selezionate o ignorare alcune classi entro packagesToScan?

+0

È possibile rimuovere/commentare l'annotazione @Entity fino a quando l'entità è completa. Di quanto non verrà raccolto dal fornitore di persistenza. –

+0

Non è possibile scansionare solo alcune entità particolari con le quali voglio testare? – TheKojuEffect

+0

Puoi anche rimuovere l'opzione packagesToScan, creare persistence.xml ed elencare entità qui. Continuo a non capire la tua motivazione ad escludere alcune entità: puoi rimuovere facilmente le annotazioni @Entity se ti trovi nel bel mezzo dello sviluppo e la tua entità non è completa o mi manca qualcosa? –

risposta

6

Ho cercato di risolvere lo stesso problema e finalmente una soluzione, come di seguito:

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

mi sono reso conto che c'è un setEntityTypeFilters function sulla classe LocalSessionFactoryBean che può essere utilizzata per filtrare quali classi di essere incluso. In questo esempio ho usato RegexPatternTypeFilter ma ci sono anche other types of filters.

Si noti inoltre che i filtri funzionano con la semantica inclusa. Per convertire in semantica esclude ho dovuto usare lookahead negativo nella regex.

Questo esempio mostra la configurazione xml ma dovrebbe essere banale da convertire in configurazione basata su java.

2

Mi sono imbattuto in un problema simile. Avevo bisogno di aggiungere alcune ma non tutte le entità da un pacchetto. Ecco come l'ho fatto:

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