代码之家  ›  专栏  ›  技术社区  ›  Mayday

Springboot将@PersistenceContext EntityManager连接到@Bean

  •  0
  • Mayday  · 技术社区  · 7 年前

    我在不同的文件中声明了这4个 EntityManagers 遵循此模板:

    存储配置模板

    @Configuration
    @EnableJpaRepositories(
        basePackages = "...myReposPackages...",
        entityManagerFactoryRef = ConfigurationChanges.ENTITY_MANAGER_BEAN_NAME,
        transactionManagerRef = ConfigurationChanges.TRANSACTION_MANAGER_BEAN_NAME
    )
    @ComponentScan("...myScanPackages...")
    @EnableConfigurationProperties
    public class MyRepoConfigClass {
      ...
      ...
      public final static String ENTITY_MANAGER_BEAN_NAME = "...EntityManagerSingleConstant..."; // D1EntityManager / D2EntityManager / BaseEntityManager / oldDbEntityManager for different classes
      public final static String TRANSACTION_MANAGER_BEAN_NAME = "...TransactionManagerSingleConstant..."; // D1TransactionManager / D2TransactionManager / BaseTransactionManager / oldDbTransactionManager for different classes
    
      @Bean(name=ENTITY_MANAGER_BEAN_NAME)
      @Qualifier(ENTITY_MANAGER_BEAN_NAME) // Not sure if this is needed, I just added it trying to make it work
      public LocalContainerEntityManagerFactoryBean myClassEntityManager() {
        LocalContainerEntityManagerFactoryBean em
                = new LocalContainerEntityManagerFactoryBean();
        ... initializations ...
        em.setDataSource(...myDataSource...)
        em.setPackagesToScan("...EntitiesPackagesToScan...")
    
        em.setPersistenceUnitName(ENTITY_MANAGER_BEAN_NAME); // Not sure if this is needed, I just added it trying to make it work
      }
    
      @Bean(name=TRANSACTION_MANAGER_BEAN_NAME)
      @Qualifier(TRANSACTION_MANAGER_BEAN_NAME) // Not sure if this is needed, I just added it trying to make it work
      public PlatformTransactionManager myClassTransactionManager() {
        JpaTransactionManager transactionManager
                = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(
                myClassEntityManager().getObject());
        return transactionManager;
      }
    
    }
    

    Services 这样地:

    服务模板

    @Service
    public class myServiceClass {
    
      @PersistenceContext(unitName = MyRepoConfigClass.ENTITY_MANAGER_BEAN_NAME) // Thought this might be the solution for JPA PersistenceContext, but did not work anyway
      @Qualifier(MyRepoConfigClasss.ENTITY_MANAGER_BEAN_NAME) // Not sure if this is supposed to be done like this. In normal spring boot components it works
      private EntityManager entityManager; // <- This injection fails
    
    }
    

    EntityManger 应通过以下任一方式使用 @PersistenceContext ( 单位名称 @Qualifier

    然而,正如错误所说,springboot不知道这4个bean使用哪一个。

    更新

    完整堆栈跟踪:

    组织。springframework。豆。工厂BeanCreationException:创建名为“changes”的bean时出错:注入持久性依赖项失败;嵌套异常为org。springframework。豆。工厂NoUniqueBeanDefinitionException:没有“javax”类型的限定bean。坚持不懈EntityManagerFactory可用:需要单个匹配bean,但找到5个:D1EntityManager、D2EntityManager、BaseEntityManager、oldDbEntityManager、DeviceApigurationDbConfigurationDbEntityManager 在org。springframework。豆。工厂支持AbstractAutowireCapableBeanFactory。populateBean(AbstractAutowireCapableBeanFactory.java:1383)~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE] 在org。springframework。豆。工厂支持AbstractAutowireCapableBeanFactory。doCreateBean(AbstractAutowireCapableBeanFactory.java:575)~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE] 在org。springframework。豆。工厂支持AbstractAutowireCapableBeanFactory。createBean(AbstractAutowireCapableBeanFactory.java:498)~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE] 在org。springframework。豆。工厂支持AbstractBean工厂。lambda$doGetBean$0(AbstractBeanFactory.java:320)~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE] 在org。springframework。豆。工厂支持DefaultSingletonBeanRegistry。getSingleton(DefaultSingletonBeanRegistry.java:222)~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE] 在org。springframework。豆。工厂支持AbstractBean工厂。doGetBean(AbstractBeanFactory.java:318)~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE] 在org。springframework。豆。工厂支持DefaultListableBeanFactory。预实例化单例(DefaultListableBeanFactory.java:846)~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE] 在org。springframework。上下文支持AbstractApplicationContext。finishBeanFactoryInitialization(AbstractApplicationContext.java:869)~[spring-context-5.0.9.RELEASE.jar:5.0.9.RELEASE] 在org。springframework。上下文支持AbstractApplicationContext。刷新(AbstractApplicationContext.java:550)~[spring-context-5.0.9.RELEASE.jar:5.0.9.RELEASE] 在org。springframework。靴子SpringApplication。刷新(SpringApplication.java:780)[spring-boot-2.0.5.RELEASE.jar:2.0.5.RELEASE] 在org。springframework。靴子SpringApplication。refreshContext(SpringApplication.java:412)[spring-boot-2.0.5.RELEASE.jar:2.0.5.RELEASE] 在org。springframework。靴子SpringApplication。run(SpringApplication.java:1277)[spring-boot-2.0.5.RELEASE.jar:2.0.5.RELEASE] 在com。我的公司。装置应用程序编程接口。gw。应用main(Application.java:35)[类/:na] 原因:组织。springframework。豆。工厂NoUniqueBeanDefinitionException:没有“javax”类型的限定bean。坚持不懈EntityManagerFactory可用:需要单个匹配bean,但找到5个:D1EntityManager、D2EntityManager、BaseEntityManager、oldDbEntityManager、DeviceApigurationDbConfigurationDbEntityManager 在org。springframework。豆。工厂支持DefaultListableBeanFactory。resolveNamedBean(DefaultListableBeanFactory.java:1139)~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE] 在org。springframework。豆。工厂支持DefaultListableBeanFactory。resolveNamedBean(DefaultListableBeanFactory.java:1079)~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE] 在org。springframework。orm。jpa。支持PersistenceAnnotationBeanPostProcessor。FindentialManagerFactory(PersistenceAnnotationBeanPostProcessor.java:532)~[spring-orm-5.0.9.RELEASE.jar:5.0.9.RELEASE] 在org。springframework。orm。jpa。支持PersistenceAnnotationBeanPostProcessor$PersistenceElement。resolveEntityManager(PersistenceAnnotationBeanPostProcessor.java:700)~[spring-orm-5.0.9.RELEASE.jar:5.0.9.RELEASE] 在org。springframework。豆。工厂注释。InjectionMetadata$InjectedElement。注入(InjectionMetadata.java:180)~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE] 在org。springframework。orm。jpa。支持PersistenceAnnotationBeanPostProcessor。后处理属性值(PersistenceAnnotationBeanPostProcessor.java:353)~[spring-orm-5.0.9.RELEASE.jar:5.0.9.RELEASE] ... 省略17个公共框架

    0 回复  |  直到 7 年前