在基于Spring+JPA(如hibernate)的应用当中,可能会遇到在同一ApplicationContext中集成多个数据源(多个持久化单元,多个事务管理器),每个数据源独立参与事务,非分布式事务,如应用系统集成不同的组件,不同组件使用不同的数据库系统,或不同组件需要分库存储。多数据源配置与单数据源配置基本类似,但也存在许多差异,如果配置不当,会造成应用无法集成。
配置:
@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)
配置:
@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配置方式。
使用注解@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 {
}
在代码中可以直接使用,定义的专有事务配置。
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