Spring项目中存在多个数据库连接问题

时间:2016-02-08 05:01:11

标签: java spring hibernate jpa transactions

我将在一个spring项目中配置两个数据库连接。以下列方式创建了两个数据源bean。

   @Bean(destroyMethod = "close")
        public BoneCPDataSource getDataSource() {

            ....
            ....
            return dataSource;
    }

    @Bean(destroyMethod = "close")
        public BoneCPDataSource getDataSource2() {

         ....
         ....

        return dataSource;
    }

这是我创建实体经理的方式。

@Bean
@Qualifier("entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    ...
    em.setDataSource(getDataSource());
    em.setPersistenceUnitName("entityManagerFactory");
    ...

    return em;
}

@Bean
@Qualifier("entityManagerFactory2")
public LocalContainerEntityManagerFactoryBean entityManagerFactory2() {
    ...
    em.setDataSource(getDataSource2());
    em.setPersistenceUnitName("entityManagerFactory2");
    ...

    return em;
}

然后我在Repository实现类中的实体管理器上自动连接,它适用于非事务性数据。

@PersistenceContext(unitName = "entityManagerFactory2")
@Qualifier(value = "entityManagerFactory2")
private EntityManager entityManager2;

然后以下列方式创建交易管理器。

@Bean
@Primary
public JpaTransactionManager getTransactionManager() {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());

    return transactionManager;
}

@Bean(name = "transactionManager2")
@Qualifier("transactionManager2")
public JpaTransactionManager getTransactionManager2() {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory2().getObject());

    return transactionManager;
}

    return transactionManager;
}

但问题是,我无法使用Bean transactionManager2插入或更新表,因为我不知道配置它的正确方法。

但是只能使用getTransactionManger插入或更新问题是无法配置第二个连接。得到了这个错误。

Caused by: javax.persistence.TransactionRequiredException: no transaction is in progress
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.checkTransactionNeeded(AbstractEntityManagerImpl.java:1171)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1332)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

1 个答案:

答案 0 :(得分:5)

如果要使用第二个事务管理器,则需要使用以下命令注释服务方法:

@Transactional("transactionManager2")
public void insertPost(Post post) { ... }