簡體   English   中英

如何使用相同的持久性單元使用 EntityManager 和 EntityManagerFactory 訪問具有相同實體的不同數據源

[英]How to use same Persistence Unit to access different datasources with the same entities using EntityManager and EntityManagerFactory

我目前正在使用 Java 17、Wildfly 25.0.1 和 JPA,超過 Hibernate 5.3。

我有一個應用程序使用映射的注釋和實體來訪問單個數據庫。 我正在使用帶有數據源的 PersistenceUnit,它工作正常。

我想要實現的是以編程方式選擇具有相同 PersistenceUnit 的不同數據源,以便為不同的客戶訪問同一數據庫的不同副本。 客戶數量會增加,所以我不能使用多個 PU。

到目前為止,我已經使用了一個注入的 EntityManager,如下所示:

@PersistenceContext(unitName = PERSISTENCE_UNIT)
protected EntityManager     em;

我朝着創建自己的 EntityManager 實例的方向前進,所以我嘗試注入 EntityManagerFactory 而不是 EntityManager 本身:

@PersistenceUnit(unitName = PERSISTENCE_UNIT)
EntityManagerFactory        emf;

最初注入的EntityManager,經過檢查,屬於class org.jboss.as.jpa.container.TransactionScopedEntityManager。 但是,當我使用注入的 EntityManagerFactory 創建 EntityManager 時,我收到的是 org.hibernate.internal.SessionImpl。

關鍵是,雖然很多事情都可以正常工作,但應用程序中的行為有些不同。 這是一個非常大的應用程序,有很多事務,有時數據不正確等等。

有什么方法可以創建或向服務器請求 TransactionScopedEntityManager? 我已經搜索過 Wildfly 源代碼,但找不到。

此外,任何其他實現此目標的方法都將受到贊賞。

謝謝和親切的問候。

您可以通過實現MultitenantConnectionProviderCurrentTenantIdentifierResolver來使用Hibernate 的 Mulit 租戶設施來實現多租戶,這需要訪問您的 Session / Transaction Context。 這是關於Baeldung的教程。

免責聲明:我不熟悉 Wildfly,所以也許有一種本地方法可以做到這一點,類似於 Springs RoutingDataSource(請參閱問題中的 XtremerBaumers 評論)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM