spring+jpa 两个数据源配置

1. META-INF/persistence.xml :

 

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistencehttp://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
    version="1.0">
     
     org.hibernate.ejb.HibernatePersistence
  
   
   
   
   
   
   
   

   

 
   
     
     org.hibernate.ejb.HibernatePersistence
  
   
   
   
   
   
   
  

   
   

 

2.applicationContext.xml

 


    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.0.xsd
    http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

   
   
     
    
    
    
   
  
   

 
   
  
   
   
   
     
   
   
   
   
   
   
   
   
   
 

 
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
       
       
       
                            class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
               
               
           

       
   
 
 
     class="org.springframework.orm.jpa.JpaTransactionManager">
  
 

 
 
 

 


 

 
   
   
   
   
   
     
   
   
   
   
   
   
   
   
   
  
 

 
           class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
       
       
       
                            class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
               
               
           

       
   

 
     class="org.springframework.orm.jpa.JpaTransactionManager">
  
  
 

 
 
 
 
 
 

 

3. dao注解管理事务

建立两个baseDaoImpl:

public EntityManager entityManager;
 
 private EntityManagerFactory emf;
 public EntityManager getEntityManager() {
  return entityManager;
 }
 
 @PersistenceContext(unitName="aaaUnit")
 public void setEntityManager(EntityManager entityManager) {
  this.entityManager = entityManager;
 }

 @PersistenceUnit(unitName="aaaUnit")
 public void setEntityManagerFactory(EntityManagerFactory emf) {
  this.emf = emf;
 }

 

baseDaoImpl2:

public EntityManager entityManager;
 
 private EntityManagerFactory emf;
 public EntityManager getEntityManager() {
  return entityManager;
 }
 
 @PersistenceContext(unitName="aaaUnit")
 public void setEntityManager(EntityManager entityManager) {
  this.entityManager = entityManager;
 }

 @PersistenceUnit(unitName="aaaUnit")
 public void setEntityManagerFactory(EntityManagerFactory emf) {
  this.emf = emf;
 }

用两个dao分开链接数据库。

实现类继承basedao或basedao2即可。

 

补充:service添加事务工厂,则需要改变一些配置。

1.两个数据库对应的事务各添加一句  
例如:


  
  
 

2. 添加之后,会提示出错,不支持qualifier 。

则将applicationContext.xml的头部更改为:

 

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
            http://www.springframework.org/schema/tx 
            http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

到此完成。

 

配置过程中遇到的问题

配置完成后,启动项目应该达到自动建立数据库的效果。

控制台打印错误:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [javax.persistence.EntityManagerFactory] is defined: expected single bean but found 2

如果认真观察的话,上面应该还会提示在创建哪个bean的时候提示出错。

那么提示错误的bean里面应该有用到EntityManagerFactory。

解决办法:对set方法添加注解,如:

@PersistenceUnit(unitName="aaaUnit")
 public void setEntityManagerFactory(EntityManagerFactory emf) {
  this.emf = emf;
 }

这样来区分数据源。

重启,ok。

 

参考文章:http://my.oschina.net/frankly/blog/27702

 

你可能感兴趣的:(spring+jpa 两个数据源配置)