如何将实体分布在Spring数据jpa和eclipselink中的不同模块上



我目前正在开发一个具有核心模块和不同"扩展"模块的应用程序。核心模块包括基于Spring配置类的JPA配置,以及一些应在"扩展"模块中使用的"基本"实体及其存储库。扩展模块包含额外的Entity类和JPARepository。当启动扩展模块的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类和@EnableJpaRepository,以及具有指向扩展存储库包包的@EnableJpa repository的扩展的spring配置
  • 在spring配置中为该扩展创建了一个附加的LocalContainerEntityManagerFactoryBean,该扩展具有自己的JPaRepository Annotation,并且setPackagesToScan仅指向包含@Entity类的扩展包。本例中的coreEntityManager仅指向核心模块中包含@Entity类的包
  • 创建了一个名为coreEntityManager的LocalContainerEntityManagerFactoryBean,setPackagesToScan包括核心和扩展包,其中包含指向核心和扩展repo包的@Entity类和@EnableJpaRepository

对于前两种方法,已经提到的错误会出现,而对于第三种方法,没有找到配置存储库:

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;
}
...

最后,我想实现的是拥有一种"乐高"积木,在这种积木中,模块及其配置可以简单地作为依赖项添加,相应的配置实体(及其表)可以添加到持久性单元中,而无需进一步调整。

有谁能帮我吗?

向致意

缺陷

所以很明显,我看不到树的木头。。。我错过了其中一个扩展实体中的@Entity注释。。。啊手掌

感谢大家阅读我的问题并提供帮助!我真可耻!

最新更新