В настоящее время я разрабатываю приложение с модулем ядра и различными модулями «расширения».Базовый модуль включает в себя конфигурацию JPA, основанную на классе конфигурации Spring, а также некоторые «базовые» объекты и их репозитории, которые должны использоваться в «расширенных» модулях.Модули расширения содержат дополнительные классы сущностей и JPARepositories.При запуске теста JUnit для модуля расширения я сталкиваюсь со следующей ошибкой:
No [ManagedType] was found for the key class [a.b.c.data.Config] in
the Metamodel - please verify that the [Managed] class was referenced
in persistence.xml using a specific <class>a.b.c.data.Config</class>
property or a global <exclude-unlisted-classes>false</exclude-unlisted-classes>
element.
. Для этого я попробовал три различных подхода:
- Создал один LocalContainerEntityManagerFactoryBean с именем coreEntityManager сsetPackagesToScan, включая ядро и пакет расширений, которые содержат классы @Entity и @EnableJpaRepositories, указывающие на пакет репозитория core, и конфигурацию весны расширения, имеющего @EnableJpaRepositories, указывающий на пакет репозитория расширений
- Создано дополнительноеLocalContainerEntityManagerFactoryBean в весеннем конфиге для расширения с его собственной аннотацией JPaRepository и с setPackagesToScan, указывающим только на пакет расширения, содержащий классы @Entity.В этом случае coreEntityManager указывает только на пакет в модуле ядра, содержащий классы @Entity.
- Создан один LocalContainerEntityManagerFactoryBean с именем coreEntityManager с setPackagesToScan, включая ядро и пакет расширения, которые содержат классы @Entity и ядро@EnableJpaRepositories, указывающие на пакеты репозитория ядра и расширения
При первых двух подходах появляется уже упомянутая ошибка, в то время как при третьем подходе хранилище конфигурации не найдено:
No qualifying bean of type 'a.b.c.ext.repositories.ConfigRepository' available
Код для подхода 1:
@Configuration
@ComponentScan(basePackages = {"a.b.c.core.services"})
@EnableJpaRepositories(basePackages = {"a.b.c.core.repositories"}, entityManagerFactoryRef = "coreEntityManager")
public class CoreJPAConfig {
...
@Bean
public LocalContainerEntityManagerFactoryBean coreEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
JpaVendorAdapter jpaVendorAdapter = new EclipseLinkJpaVendorAdapter();
JpaDialect jpaDialect = new EclipseLinkJpaDialect();
em.setJpaVendorAdapter(jpaVendorAdapter);
em.setJpaDialect(jpaDialect);
em.setJpaPropertyMap(getJpaProperties());
em.setPersistenceUnitName("a.core");
em.setPackagesToScan("a.b.c.core.data",
"a.b.c.ext.data");
em.setDataSource(dataSource());
return em;
}
...
}
Configuration
@ComponentScan(basePackages = {
"a.b.c.config.services"})
@EnableJpaRepositories(basePackages = {"a.b.c.ext.repositories"}, entityManagerFactoryRef = "coreEntityManager")
public class JobSpringConfig {
...
}
Код для подхода 2:
@Configuration
@ComponentScan(basePackages = {"a.b.c.core.services"})
@EnableJpaRepositories(basePackages = {"a.b.c.core.repositories"}, entityManagerFactoryRef = "coreEntityManager")
public class CoreJPAConfig {
...
@Bean
public LocalContainerEntityManagerFactoryBean coreEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
JpaVendorAdapter jpaVendorAdapter = new EclipseLinkJpaVendorAdapter();
JpaDialect jpaDialect = new EclipseLinkJpaDialect();
em.setJpaVendorAdapter(jpaVendorAdapter);
em.setJpaDialect(jpaDialect);
em.setJpaPropertyMap(getJpaProperties());
em.setPersistenceUnitName("a.core");
em.setPackagesToScan("a.b.c.core.data");
em.setDataSource(dataSource());
return em;
}
...
}
@Configuration
@ComponentScan(basePackages = {"a.b.c.config.services"})
@EnableJpaRepositories(basePackages = {"a.b.c.ext.repositories"}, entityManagerFactoryRef = "jobEntityManager")
public class JobSpringConfig {
...
@Bean
public LocalContainerEntityManagerFactoryBean jobEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
JpaVendorAdapter jpaVendorAdapter = new EclipseLinkJpaVendorAdapter();
JpaDialect jpaDialect = new EclipseLinkJpaDialect();
em.setJpaVendorAdapter(jpaVendorAdapter);
em.setJpaDialect(jpaDialect);
em.setJpaPropertyMap(getJpaProperties());
em.setPersistenceUnitName("a.config");
em.setPackagesToScan("a.b.c.ext.data");
em.setDataSource(dataSource);
return em;
}
Код для подхода 3:
@Configuration
@ComponentScan(basePackages = {"a.b.c.core.services"})
@EnableJpaRepositories(basePackages = {"a.b.c.core.repositories",
"a.b.c.ext.repositories"}, entityManagerFactoryRef = "coreEntityManager")
public class CoreJPAConfig {
...
@Bean
public LocalContainerEntityManagerFactoryBean coreEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
JpaVendorAdapter jpaVendorAdapter = new EclipseLinkJpaVendorAdapter();
JpaDialect jpaDialect = new EclipseLinkJpaDialect();
em.setJpaVendorAdapter(jpaVendorAdapter);
em.setJpaDialect(jpaDialect);
em.setJpaPropertyMap(getJpaProperties());
em.setPersistenceUnitName("a.core");
em.setPackagesToScan("a.b.c.core.data",
"a.b.c.ext.data");
em.setDataSource(dataSource());
return em;
}
...
Чего я хочу достичь вВ конце концов, нужно создать своего рода строительные блоки Lego, в которых модули и их конфигурации могут быть просто добавлены в виде зависимости, а соответствующие объекты конфигурации (и их таблицы) добавлены в модуль постоянства без необходимости дальнейшей настройки.
Кто угодноможете мне помочь?
С уважением
Дефект