【发布时间】:2020-02-24 13:07:23
【问题描述】:
在我的会话中,我需要调用 db1 和 db2 上的 2 个不同的过程。当我单独调用它们时它工作正常,但是当我在同一个会话中调用它们时它会失败。它正确获取第一个数据,但在第二次调用时失败,因为它在 db1 上查找第二个过程,尽管实体管理器的数据源已正确更改。
我错过了什么?
这里是代码 sn-p
@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
}
【问题讨论】:
-
您无法切换数据源,因为它绑定到
EntityManager(或实际上是活动连接)。但是,如果您正在调用一个过程,为什么还要使用 JPA 而不是简单地使用 JDBC?另一件需要考虑的事情是,EntityManager可能会因为OpenEntityManagerInViewFilter而很早就打开。您可能希望通过设置spring.jpa.open-in-view=false来禁用此功能。这可能会导致一些问题,因为您现在在前端放松了延迟加载。 -
这是一个遗留项目,所以我不能做大的改变。有没有适合这种结构的解决方案/解决方法,或者不可能?
标签: java oracle hibernate spring-boot entitymanager