具有实体管理器的Spring Multi Datasource

时间:2017-01-19 11:05:26

标签: java spring

我在使用spring的多数据源连接时遇到问题,其中一个事务正在运行,但是其他一个没有工作。请帮忙。

***********Data Source 1 start************
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="database1.ds" />
     <property name="persistenceUnitName" value="database1" />        
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
    <property name="persistenceXmlLocation" value="classpath:jpa-persistence.xml" />
</bean>

<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="database" value="ORACLE" />
    <property name="showSql" value="false" />
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" p:entityManagerFactory-ref="entityManagerFactory" />

***********Data Source 1 end************
***********Data Source 2 start************

<bean id="entityManagerFactory2"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="database2.ds" />
     <property name="persistenceUnitName" value="database2" />        
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter2" />
    <property name="persistenceXmlLocation" value="classpath:jpa-persistence.xml" />
</bean>

<bean id="jpaVendorAdapter2
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="database" value="ORACLE" />
    <property name="showSql" value="false" />
</bean>

<bean id="transactionManager2" class="org.springframework.orm.jpa.JpaTransactionManager"
        p:entityManagerFactory-ref="entityManagerFactory2" />  

***********Data Source 2 end************

<context:component-scan base-package="com.wmi.lakshya" annotation-config="true"     scope-resolver="org.springframework.context.annotation.Jsr330ScopeMetadataResolver"/>


<tx:annotation-driven />
<cache:annotation-driven />

实体经理班级

@Repository
@Scope("singleton")
public class EntityManagerImpl implements EntityManagerGenerator {

    @PersistenceContext(unitName = "database1",type=PersistenceContextType.EXTENDED)
    private EntityManager entityManager;

    @PersistenceContext(unitName = "database2",type=PersistenceContextType.EXTENDED)
    private EntityManager entityManager2;

    @Override
    public EntityManager getEntityManager() {       
        try {           
            if (isUser1()) {
                return entityManager;
            }
            return entityManager2;

        } catch (Exception e) {         
            return entityManager;
        }
    }


}  

@Transactional(value ="transactionManager")
 public Query createNativeQuery(String sqlString) {
   return entityManager.createNativeQuery(sqlString);
 }
 @Transactional(value ="transactionManager2")
 public Query createNativeQuery1(String sqlString) {
   return entityManager1.createNativeQuery(sqlString);
 }
  

javax.persistence.TransactionRequiredException:执行   更新/删除查询

@Component
@Scope("prototype")
public class UserDAO extends AbstractDAO<User> {
    /**
     * 
     */
    private static final Logger LOGGER = Logger.getLogger(UserDAO.class);

    /**
     * 
     */
    protected UserDAO() {
        super(User.class);
    }

    public void resetFailAttempts(String userName){
        // em is entity manager class
         em.createNativeQuery("update OMS_USER_MASTER set fail_attempts = 0 where login_id = :loginId ")
                .setParameter(QueryParameters.LOGIN_ID, userName)
                .executeUpdate();
    }

}

当与数据源1连接工作时,数据源根据条件进行切换,但不适用于datasource2。

0 个答案:

没有答案