春季数据JPA:库多个数据库/ Entitymanger配置(Spring Data JPA: Re

2019-09-03 04:33发布

我有两个Entitymanager bean的配置。 各指向一个单独的数据库具有不同的模式(一个是Oracle,另一种是在内存中的H2)

我能做什么,解决什么样的EntityManager应该用于每个库的不确定性? 现在,我得到这个错误:

 No unique bean of type [javax.persistence.EntityManagerFactory] is defined:
 expected single bean but found 2

我想我可以简单地通过使用类似提供快速修复

<jpa:repositories base-package="com.foo.repos.ora"
 entity-manager-factory-ref="entityManagerFactoryA">

<jpa:repositories base-package="com.foo.repos.m2"
 entity-manager-factory-ref="entityManagerFactoryB">

但希望有一个更好的解决方案。

编辑:

我给你当前方案的想法:

Spring的配置:这里有两种EM

<jpa:repositories base-package="com.foo.repos.ora" entity-manager-factory-ref="entityManagerFactory"/>
<jpa:repositories base-package="com.foo.repos.m2" entity-manager-factory-ref="entityManagerFactory2"/>
<context:component-scan base-package="com.foo" />  ....

从这里的一切都是在“包com.foo.repos.ora”继格局如何使自定义库 ,我得到两个接口“ARepository”,“ARepositoryCustom”及其实施“ARepositoryImpl”像这样

@Repository
public interface ARepository extends ARepositoryCustom, JpaRepository<myEntity, BigDecimal>, QueryDslPredicateExecutor {

}

public interface ARepositoryCustom {
    FooBar lookupFooBar()
}

public class ARepositoryImpl extends QueryDslRepositorySupport implements ARepositoryCustom {
    ARepositoryImpl(Class<?> domainClass) {
        super(domainClass.class)
    }

    ARepositoryImpl() {
        this(myEntity.class)
    }

    @Override
    FooBar lookupFooBar() {
        JPQLQuery query = ....
        ....
        return found
    }
}

导致以下错误消息:

org.springframework.beans.factory.BeanCreationException:由造成错误创建名为“aRepositoryImpl”豆:持久性的依赖注入失败; 嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:类型的无独特豆[javax.persistence.EntityManagerFactory]被定义: 预期单个豆但发现2

这当然是正确的,有2种EM豆,但由于我的限制EM#1又名“entityManagerFactory的”打包“com.foo.repos.ora”而已,我还是不知道如何引用确切的EM豆。

Answer 1:

还有就是引擎盖下没有魔法。

<jpa:repositories base-package="com.foo.repos.ora" entity-manager-factory-ref="entityManagerFactory"/>

不帮你在所有与您的自定义接口实现。 我发现最好的办法是把你的自定义实现定期豆。 所以,我在Spring配置中定义的“sharedEntitManager”豆像这样

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
       ...
</bean>
<bean id="sharedEntityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
        <property name = "entityManagerFactory" ref="entityManagerFactory"/>
</bean>

在那之后,我简单地注入了EntityManager到我的执行豆

<bean id="aRepositoryImpl" class="comm.foo.repos.ora.ARepositoryImpl">
    <property name="entityManager" ref="sharedEntityManager"/>
</bean>

不同的EntityManager的工厂之间,但仅适用于直春季数据存储库的“EntityManager的工厂-REF”属性区分(即只对接口)。 但是,它没有与任何你实现的关注自身。

把它们加起来

1)如果单纯依靠标准的Spring数据仓库没有定制的实现,使用“实体管理器工厂-REF”属性来区分数据库。

图2a)此外,如果你使用任何定制实现,直接注入相应的EntityManager到实现类。 Wirering是根据你的Spring XML配置的控制完成。 出于某种原因,我无法使用@Autowire注释与@Qualifier以引用正确的EntityManager。 编辑我只是了解了@Resource注解

@Resource(name =  "sharedEntityManagerA")
EntityManager entityManager


<bean id="sharedEntityManagerA" name="sharedEntityManagerA" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
        <property name = "entityManagerFactory" ref="entityManagerFactory"/>
</bean>

有了这个手头选择EntityMAnger应该用什么变得简单。 无需管道一切togehther在context XML。

2B)作为替代Spring的XML配置钩住你的东西,你也可以去

@PersistenceContext(的unitName = “nameOfPersistenceUnit”)

注入的entityManagerFactory正确

虽然“nameOfPersistenceUnit” referes到你的持久坐在你的标准JPA的persistence.xml

然而2B)不与“QueryDslRepositorySupport”顺利的话,因为它期待一个EntityManager实例。 但我发现,“QueryDslRepositorySupport”不管怎样都不提供太多的支持,所以我删除它。



文章来源: Spring Data JPA: Repositories for multiple database / Entitymanger configurations