私はそれを理解しようとして一日を費やしましたが、最終的に専門家のアドバイスのために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;
}
}