2

私はそれを理解しようとして一日を費やしましたが、最終的に専門家のアドバイスのためにstackoverflowに頼らなければなりませんでした.

以下のように、2 つのデータソースと 2 つの LocalContainerEntityManagerFactoryBean を持つように Java を使用してスプリング構成をセットアップしています。しかし、Spring はデフォルトで entityManagerFactory() を探し、例外をスローしているようです (以下にスタックトレースが含まれています)。デフォルト名の代わりに私のentitymanagerfactoriesを使用するようにSpringを設定するにはどうすればよいですか。

@Bean(name="visionDataSource")
public DataSource visionDataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    // set properties..
    return dataSource;
}

@Bean(name="stormDataSource")
public DataSource visionDataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    // set properties..
    return dataSource;
}

  @Bean(name="visionentityManagerFactory")
public LocalContainerEntityManagerFactoryBean visionentityManagerFactory() {
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
    entityManagerFactoryBean.setDataSource(visionDataSource());
    //entityManagerFactoryBean.setPersistenceUnitManager(persistenceUnitManager());
    //entityManagerFactoryBean.setPersistenceXmlLocation(null);
    entityManagerFactoryBean.setPersistenceUnitName("visionEntityManagerFactory");
    entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistence.class);
    entityManagerFactoryBean.setPackagesToScan(env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
    entityManagerFactoryBean.setJpaProperties(hibProperties());
    entityManagerFactoryBean.afterPropertiesSet();
    System.out.println("*********************visionEntityManagerFactory********************");
    return entityManagerFactoryBean;
}

 @Bean(name="stormEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean stormEntityManagerFactory() {
    entityManagerFactoryBean.setDataSource(stormDataSource());
    // set other properties
    return entityManagerFactoryBean;
  }

エラーログ:

原因: org.springframework.beans.factory.BeanCreationException: 名前 '(inner bean)#1' の Bean の作成中にエラーが発生しました: コンストラクター引数の設定中に Bean 'entityManagerFactory' への参照を解決できません。ネストされた例外は org.springframework.beans.factory.NoSuchBeanDefinitionException: 'entityManagerFactory' という名前の Bean が org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:329) で org.springframework.beans.factory で定義されていません.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:107) at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:616) at org.springframework.beans.factory.support.ConstructorResolver.

原因: org.springframework.beans.factory.NoSuchBeanDefinitionException: 'entityManagerFactory' という名前の Bean が org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:549) で org.springframework.beans.factory に定義されていません.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1095) で org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:277) で org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory) .java:193) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:323) ... 59 もっと見る

更新:JPARepositoryを使用しています

  public interface ContactRepository extends JpaRepository<Contact, Serializable> {
    List<Contact> findByCompanyId(int companyId);
  }

以下のように、entitymanager を注入するカスタム リポジトリを拡張しようとしました。しかし、これも役に立ちませんでした。

  public interface ContactRepository extends DefaultRepository<Contact, Serializable> {
    List<Contact> findByCompanyId(int companyId);
   }

@NoRepositoryBean
public class DefaultRepositoryImpl<T, ID extends Serializable> extends SmpleJpaRepository<T, ID> implements 
                        DefaultRepository<T,ID> {

@PersistenceContext(unitName="visionEntityManagerFactory")
private EntityManager entityManager;

/**
 * @param domainClass
 * @param em
 */
 public DefaultRepositoryImpl(Class<T> domainClass, EntityManager em) {
 super(domainClass, em);
 }

 /**
  * {@inheritDoc}
  */
 protected Object getTargetRepository(RepositoryMetadata metadata) {
     return new DefaultRepositoryImpl<T, ID>((Class<T>) metadata.getDomainType(), entityManager);
 }
 /**
  * {@inheritDoc}
  */
 protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
     return DefaultRepository.class;
     }
  }
4

1 に答える 1