Java 在同一会话中更改entitymanager数据源

Java 在同一会话中更改entitymanager数据源,java,oracle,hibernate,spring-boot,entitymanager,Java,Oracle,Hibernate,Spring Boot,Entitymanager,在我的会话中,我需要调用db1和db2上的两个不同过程。当我单独调用它们时,它工作正常,但当我在同一会话中调用它们时,它失败。它正确地获取第一个数据,但在第二次调用时失败,因为它在db1上查找第二个过程,尽管EntityManager的数据源已正确更改 我错过了什么 下面是代码片段 @Repository @Transactional public class DB1Dao { @PersistenceContext() private EntityManager entity

在我的会话中,我需要调用db1和db2上的两个不同过程。当我单独调用它们时,它工作正常,但当我在同一会话中调用它们时,它失败。它正确地获取第一个数据,但在第二次调用时失败,因为它在db1上查找第二个过程,尽管EntityManager的数据源已正确更改

我错过了什么

下面是代码片段

@Repository
@Transactional
public class DB1Dao {

    @PersistenceContext()
    private EntityManager entityManager;

    @SuppressWarnings("unchecked")
    public Model1 getData(String param1) {
    .....
    }
}

@Repository
@Transactional
public class DB2Dao {

    @PersistenceContext()
    private EntityManager entityManager;

    @SuppressWarnings("unchecked")
    public Model2 getData(String param2) {
    .....
    }
}


@Autowired 
private DB1Dao dao1;

@Autowired 
private DB2Dao dao2;

@RequestMapping(value = "/inquiry", method = RequestMethod.POST)
public ResponseEntity<Object> inquiryService(@RequestBody InquiryRequest inquiryRequest){   
   ....
   Model1 model1 = dao1.getData(param2);   // success

  ....
  Model2 model 2 = dao2.getData(param2);  // fails since it looks for second procedure on db1
}   
@存储库
@交易的
公共类DB1Dao{
@PersistenceContext()
私人实体管理者实体管理者;
@抑制警告(“未选中”)
公共模型1获取数据(字符串参数1){
.....
}
}
@存储库
@交易的
公共类DB2Dao{
@PersistenceContext()
私人实体管理者实体管理者;
@抑制警告(“未选中”)
公共模型2获取数据(字符串参数2){
.....
}
}
@自动连线
私人DB1Dao dao1;
@自动连线
私有DB2Dao-dao2;
@RequestMapping(value=“/inquiry”,method=RequestMethod.POST)
公共响应属性查询服务(@RequestBody InquiryRequest InquiryRequest){
....
Model1 Model1=dao1.getData(param2);//成功
....
Model2 model 2=dao2.getData(param2);//失败,因为它在db1上查找第二个过程
}   

您没有显示任何与持久性相关的配置信息,但我想您应该通过正确命名存储库来区分它们:

@PersistenceContext(unitName = "db1PersitenceUnitName")
        private EntityManager entityManager;

unitName是做什么用的?它导致错误:…需要一个名为“DB1PersistenceUnitName”的bean,但找不到该bean。注入点具有以下注释:-@org.springframework.beans.factory.annotation.Autowired(required=true)Actudio:考虑在您的配置中定义一个名为“Db1PuristIn UnITNEY”的bean。BTW在应用程序启动动态地创建数据源,并通过从您的SturixEng.x:<代码> org .Hibernate…< /代码>中扩展ActuaTrutoDATAuthCe类来更改数据源。总是足够的。因此,请查看您编写的路由代码(或复制到此处)。您无法切换数据源,因为它与
EntityManager
(或实际上是活动连接)绑定。但是,如果您正在调用一个过程,为什么还要使用JPA而不是简单地使用JDBC呢?另一件需要考虑的事情是,
EntityManager
可能由于
OpenEntityManagerInViewFilter
而提前打开。您可能希望通过设置
spring.jpa.open in view=false来禁用此功能。这可能会导致一些问题,因为您现在松开了前端的延迟加载。这是一个遗留项目,因此我无法进行重大更改。是否有适合此结构的解决方案/解决方法,或者不可能?