Spring JPA多数据源配置

Spring JPA多数据源配置

JamesGore119@gmail.com

 

       在基于Spring+JPA(如hibernate)的应用当中,可能会遇到在同一ApplicationContext中集成多个数据源(多个持久化单元,多个事务管理器),每个数据源独立参与事务,非分布式事务,如应用系统集成不同的组件,不同组件使用不同的数据库系统,或不同组件需要分库存储。多数据源配置与单数据源配置基本类似,但也存在许多差异,如果配置不当,会造成应用无法集成。

一、     现象

1.      注入EntityManager报错

   配置:

   @PersistenceContext

   private EntityManager em;

   报错:

       org.springframework.beans.factory.BeanCreationException:Error creating bean with name 'rbc-prefs.preferenceDao': Injection ofpersistence dependencies failed;    nested exception isorg.springframework.beans.factory.NoSuchBeanDefinitionExcept

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

at    org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(Persiste

nceAnnotationBeanPostProcessor.java:341)      

2.      事务报错

       配置:

       <tx:annotation-driventransaction-manager="rumba-commons-prefs.txManager"proxy-target-class="true"/>

       @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)

       报错:

       javax.persistence.TransactionRequiredException:no transaction is in progress

at   org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:293)

二、      持久化单元配置

       基于JPA持久化,一般通过@PersistenceContext注入EntityManager,当同一ApplicationContext存在多个数据源时,需要指定持化单元名称,否则容器无法确定需要注入哪个持久化上下文。

       建议配置:

       @PersistenceContext(unitName="rumba-commons-prefs.persistent-unit")

三、      事务管理配置

       Spring事务管理是基于Spring AOP,所以Spring事务配置有两种方式:注解和XML配置方式。

3.      注解方式

       使用注解@Transactional是常见的事务配置文式,当通过<tx:annotation-driventransaction-manager="transactionManager"/>开启事务,同一个容器中存在多个事务管理器时,后一个加载配置文件的,事务不存在。可通过Transactional属性指定事务管理器:

       @Transactional(value ="rumba-commons-prefs.txManager", propagation = Propagation.REQUIRED,rollbackFor = Exception.class)

       但这种方式,硬编码事务管理器名字,易错,难维护,可以通过定义各组件专用事务管理器,简化代码与维护:

       @Target({

    ElementType.METHOD,ElementType.TYPE })

       @Retention(RetentionPolicy.RUNTIME)

       @Transactional(value ="rumba-commons-prefs.txManager", ropagation=Propagation.REQUIRED,

    rollbackFor =Exception.class)

       public@interfacePreferenceTX {

       }

       在代码中可以直接使用,定义的专有事务配置。

4.      XML方式

       XML可以通过定久PointCut指定事务管理范围,如按包名,方法名,类名指定事务范围,实际代码为POJO,与事务无关。

        <tx:adviceid="txAdvice"transaction-manager="rumba-commons-prefs.txManager">

    <tx:attributes><tx:methodname="*"/></tx:attributes></tx:advice>

        <aop:config>

    <aop:pointcutexpression="execution(*       com.hd123.rumba.commons.prefs.jpa.JPAPreferenceDao.*(..))"  id="preference"/>

    <aop:advisoradvice-ref="txAdvice"pointcut-ref="preference"/>

      </aop:config>

 

  ......  原创文章,转载请注明出处, 本文地址:http://blog.csdn.net/jamesgore/article/details/10055787  ......

 

 

1、http://www.coderanch.com/t/558790/Spring/Spring-JPA-Hibernate-multiple-Database

2、https://jira.springsource.org/browse/SPR-3955?page=com.atlassian.jira.plugin.system

.issuetabpanels:all-tabpanel

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值