Reputation: 3377
I need two persistence contexts to manage entities in separate databases.
I am using java based config with spring 4.1.4, hibernate 4.3.7 and spring data 1.2.
Basically, CompanyApplicationContext imports two persistence contexts: PersistenceContext and SharedDbPersistenceContext. Each persistence context with its own data source, transaction manager and entity manager factory. The entities and jpa repositories for each persistence context are present in separate packages and are mentioned in persistence context class files.
I get 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 extra configuration do I need to do this to make it work? Why is each context not 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 {
}
Persistence 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;
}
}
Shared 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
}
Service:
package com.company.shared.service;
@Service
public class DataSourceServiceImpl implements DataSourceService{
@Autowired
ClientSettingsRepository clientSettingsRepository;
@Override
public List<ClientSetting> findClientDataSourceSettings() {
return clientSettingsRepository.findClientDataSourceSettings();
}
}
Upvotes: 4
Views: 6601
Reputation: 3377
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 {}
work fine.
Upvotes: 3