Search code examples
spring-bootspring-dataspring-data-jpaspring-java-config

Spring Boot Data - Getting 'Not a managed Type' error when the package is not included in default entityManager


My application has two entity managers (entityManagerFactory and entityManagerFactorySec). The default is associated with package 'com.abc.model' and the second one is associated with package 'com.abc.uw.model'.

What I observed is that the application startup is fine only if I include the second package as well to the default Entitymanager. Getting the following error even though I see from the logs that the repo got created.

nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dmUwRefRulesRsltRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class com.abc.uw.model.DmUwRefRulesRslt

Java configs are

entityManagerFactory:

return builder.dataSource(dmDs).packages(new String[]{"com.abc.model"}).build();
//startup is fine only with the commented line below
//return builder.dataSource(dmDs).packages(new String[]{"com.abc.model","com.abc.uw.model"}).build();

entityManagerFactorySec:

return builder.dataSource(dataSource).packages(new String[]{
            "com.abc.uw.model"}).persistenceUnit("alternate").build();

Could not find why it is not working when the package is included in the packages of the second entitymanager factory

I am providing the complete snippet for both the configs.

Config 1:

@Configuration
@PropertySource("classpath:application.yml")
@EnableJpaRepositories ( basePackages = "com.abc.pcs", entityManagerFactoryRef = "entityManagerFactory")
public class PersistenceConfig {

@Bean(name = "dmDs")
@ConfigurationProperties(prefix = "dm.datasource")
public FactoryBean dmJndiDataSource() {
    return new JndiObjectFactoryBean();
}

@Bean("entityBuilder")
public EntityManagerFactoryBuilder entityManagerFactoryBuilder() {
    HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
    return new EntityManagerFactoryBuilder(hibernateJpaVendorAdapter,
            new HashMap<String, Object>(){{put("eclipselink.weaving", "false");}}, null);
}

/**
 * @param builder
 * @param dmDs
 * @return
 * @link https://docs.spring.io/spring-boot/docs/current/reference/html/howto-data-access.html#howto-use-two-entity-managers
 */
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory( EntityManagerFactoryBuilder builder, @Qualifier("dmDs") final DataSource dmDs) {

    LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean = builder.dataSource(dmDs).packages(new String[]{"com.abc.model"}).build();
    return localContainerEntityManagerFactoryBean;
}

@Bean("transactionManager")
public PlatformTransactionManager transactionManager(@Qualifier("entityManagerFactory") final EntityManagerFactory entityManagerFactory) {
    return new JpaTransactionManager(entityManagerFactory);
}

}

Config 2:

@Configuration
@PropertySource("classpath:application.yml")
@EnableJpaRepositories ( basePackages = {"com.abc.clp.hnw","com.abc.uw"}, entityManagerFactoryRef = "entityManagerFactorySec")
public class AltPersistenceConfig {

    @Bean(name = "dsSecondary")
    @ConfigurationProperties(prefix = "ds_secondary.datasource")
    public FactoryBean dmEclipseLinkJndiDataSource() {
        return new JndiObjectFactoryBean();
    }
    @Bean(name="entityManagerFactorySec")
    public LocalContainerEntityManagerFactoryBean entityManagerFactorySec( EntityManagerFactoryBuilder builder, @Qualifier("dsSecondary") final DataSource dataSource) {

        LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean = builder.dataSource(dataSource).packages(new String[]{
                "com.abc.uw.model"}).persistenceUnit("alternate").build();
        return localContainerEntityManagerFactoryBean;

    }

    @Bean("transactionManagerSec")
    public PlatformTransactionManager transactionManagerEclipseLink(@Qualifier("entityManagerFactorySec") final EntityManagerFactory entityManagerFactory) {

        return new JpaTransactionManager(entityManagerFactory);
    }


}

Solution

  • I'm 99% sure that one way or the other you are referencing entities from the second package in the repository for the first one. Either directly or possibly through some attribute of an entity.