【问题标题】:change entitymanager datasource in same session在同一会话中更改 entitymanager 数据源
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • unitName 是什么?它会导致错误:...需要一个名为“db1PersitenceUnitName”的 bean,但无法找到。注入点具有以下注释: - @org.springframework.beans.factory.annotation.Autowired(required=true) 操作:考虑在您的配置中定义一个名为“db1PersitenceUnitName”的 bean。
  • 顺便说一句,我在应用程序启动时动态创建数据源并通过扩展 AbstractRoutingDataSource 类来更改数据源
  • 来自您的 persistence.xml:&lt;persistence&gt; &lt;persistence-unit name="db1PersitenceUnitName"&gt; &lt;provider&gt;org.hibernate...
  • 我从来没有尝试过,因为对我来说,容器管理就足够了。所以请看一下你写的那个路由代码(或者复制到这里)。
猜你喜欢
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多