How do I use multiple JPA persistence contexts with Spring Data JPA?

I need two persistence contexts to manage objects in different databases.

I am using java based config with spring 4.1.4, hibernate 4.3.7 and spring 1.2 data.

Basically, CompanyApplicationContext imports two persistence contexts: PersistenceContext and SharedDbPersistenceContext. Each persistence context with its own data source, transaction manager, and factory entity manager. The jpa entities and repos for each persistence context are present in separate packages and are referenced in the persistence context class files.

I am getting this error:

Not an managed type: class com.company.shared.model.ClientSetting

      

Full Exception:

Caused by: java.lang.IllegalArgumentException: Not an managed type: class com.company.shared.model.ClientSetting
    at org.hibernate.jpa.internal.metamodel.MetamodelImpl.managedType(MetamodelImpl.java:219)

      

What additional configuration do I need to do to make it work? Why isn't every context scanning and registering entities and repositories properly?

Main application context:

package com.company.config;
@Configuration
@ComponentScan(basePackages
        = "com.company"
)
@Import({
    PersistenceContext.class,
    SharedDbPersistenceContext.class})
public class CompanyApplicationContext extends WebMvcConfigurerAdapter {

}

      

Save context:

 package com.company.config;
    @Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories(
            basePackages = {"com.company.todo.repository"})
    public class PersistenceContext {

        @Resource
        private Environment environment;

        @Bean
        public DataSource dataSource() {
            BoneCPDataSource dataSource = new BoneCPDataSource();
            //init data source
            return dataSource;
        }


        @Bean
        public JpaTransactionManager transactionManager() {
            JpaTransactionManager transactionManager = new JpaTransactionManager();
            transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
            return transactionManager;
        }

        @Bean
        public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
            LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();

            entityManagerFactoryBean.setDataSource(dataSource());
            entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
            entityManagerFactoryBean.setPackagesToScan("com.company.todo.model");
            Properties jpaProperties = new Properties();
            //init jpa properties
            entityManagerFactoryBean.setJpaProperties(jpaProperties);
            return entityManagerFactoryBean;
        }

    }

      

General Db persistence context:

    package com.company.config;
    @Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories(
            basePackages = {"com.company.shared.repository"})
    public class SharedDbPersistenceContext {

        @Resource
        private Environment environment;

        @Bean
        public DataSource sharedDataSource() {
            //init and return data source
        }

        @Bean
        public JpaTransactionManager sharedDbTransactionManager() {
//init transaction manager
        }

        @Bean
        public LocalContainerEntityManagerFactoryBean sharedEntityManagerFactory() {
            LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();

            entityManagerFactoryBean.setDataSource(sharedDataSource());
            entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
            entityManagerFactoryBean.setPackagesToScan("com.company.shared.model");
            Properties jpaProperties = new Properties();
            //init jpaProperties
            entityManagerFactoryBean.setJpaProperties(jpaProperties);
            return entityManagerFactoryBean;
        }
    }

      

Repository:

package com.company.shared.repository;
@Repository
public interface ClientSettingsRepository extends JpaRepository<ClientSetting, Integer> {}

      

Entity:

package com.company.shared.model;
@Entity
public class ClientSetting implements Serializable {
//props
}

      

Services:

package com.company.shared.service;
@Service
public class DataSourceServiceImpl implements DataSourceService{

    @Autowired
    ClientSettingsRepository clientSettingsRepository;

    @Override
    public List<ClientSetting> findClientDataSourceSettings() {

        return clientSettingsRepository.findClientDataSourceSettings();
    }

}

      

+3


source to share


1 answer


It turns out I was missing entityManagerFactoryRef and transactionManagerRef in @EnableJpaRepositories annotation

 @Configuration
 @EnableTransactionManagement
 @EnableJpaRepositories(
       basePackages = {"com.company.todo.repository"},
       entityManagerFactoryRef = "mainEntityManagerFactory",
       transactionManagerRef = "entityManagerFactory")
       public class PersistenceContext {}

      

SharedDbPersistenceContext:



@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
       basePackages = {"com.company.shared.repository"},
       entityManagerFactoryRef = "sharedEntityManagerFactory",
       transactionManagerRef = "sharedDbTransactionManager")
       public class SharedDbPersistenceContext {}

      

works fine.

+1


source







All Articles