Как распространить сущности на разные модули в Spring-data-jpa и eclipselink? - PullRequest
0 голосов
/ 01 февраля 2019

В настоящее время я разрабатываю приложение с модулем ядра и различными модулями «расширения».Базовый модуль включает в себя конфигурацию 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, в которых модули и их конфигурации могут быть просто добавлены в виде зависимости, а соответствующие объекты конфигурации (и их таблицы) добавлены в модуль постоянства без необходимости дальнейшей настройки.

Кто угодноможете мне помочь?

С уважением

Дефект

1 Ответ

0 голосов
/ 07 февраля 2019

Так что, очевидно, я не смог увидеть лес за деревьями ... Я пропустил аннотацию @Entity в одной из сущностей расширения ... О, да! facepalm

Спасибо всем, кто читает мой вопрос и пытается помочь!Позор мне!

...