我将在一个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)
答案 0 :(得分:5)
如果要使用第二个事务管理器,则需要使用以下命令注释服务方法:
@Transactional("transactionManager2")
public void insertPost(Post post) { ... }