我正在尝试从1个数据源(A)读取并将数据从该数据源(A)写入另一个数据源(B)。我需要通过注释设置所有Java Spring 5 bean,因为我需要创建占位符数据源并在运行时提供登录详细信息。
我已经设置了2个LocalContainerEntityManagerFactoryBeans(使用数据源A和B)和一个JpaTransactionManager(B),将此事务管理器称为“ tm”-全部命名。
在我的DAO中,
@Transactional('tm')
@Repository
public interface SomeDao extends JpaRepository<SomeModel, Long> {
@Query("select soemthing something...")
List<SomeModel> getter(Somefields foobar);
@Modifying
@Query("insert something something...")
void insert(Somefields morestuff);
所以回到我定义JPA config / bean的地方,我有一个
@Configuration
@EnableJpaRepositories(
entityManagerFactoryRef = "A",
transactionManagerRef = "B"
)
这显然可以很好地加载,因为我可以运行getter并从数据源A获取正确的数据。当我尝试使用insert方法时-理想情况下,我想写入数据源B,它只会抛出javax.persistence。 TransactionRequiredException。即使没有插入并且使用了我的DAO继承的CrudRepository .save(Object S),它也不会插入数据库,并且调用我的DAO.flush()也会抛出no Transaction正在进行。
调用@Transactional('tm')不会自动创建某些事务吗?我不明白为什么无论尝试如何都会出现此错误。我什至可以利用这两个实体管理器和jpatransaction管理器来处理各种数据源吗?