【问题标题】:How to use same Persistence Unit to access different datasources with the same entities using EntityManager and EntityManagerFactory如何使用相同的持久性单元使用 EntityManager 和 EntityManagerFactory 访问具有相同实体的不同数据源
【发布时间】:2022-12-11 04:00:02
【问题描述】:

我目前在 Hibernate 5.3 上使用 Java 17、Wildfly 25.0.1 和 JPA。

我有一个应用程序使用映射的注释和实体来访问单个数据库。我正在使用带有数据源的 PersistenceUnit,它工作正常。

我想要实现的是以编程方式选择具有相同 PersistenceUnit 的不同数据源,以便为不同的客户访问同一数据库的不同副本。客户数量会增加,所以我不能使用多个 PU。

到目前为止,我已经使用了一个注入的 EntityManager,如下所示:

@PersistenceContext(unitName = PERSISTENCE_UNIT)
protected EntityManager     em;

我朝着创建自己的 EntityManager 实例的方向前进,所以我尝试注入 EntityManagerFactory 而不是 EntityManager 本身:

@PersistenceUnit(unitName = PERSISTENCE_UNIT)
EntityManagerFactory        emf;

最初注入的 EntityManager,经过检查,属于类 org.jboss.as.jpa.container.TransactionScopedEntityManager。 但是,当我使用注入的 EntityManagerFactory 创建 EntityManager 时,我收到的是 org.hibernate.internal.SessionImpl。

关键是,虽然很多事情都可以正常工作,但应用程序中的行为有些不同。这是一个非常大的应用程序,有很多事务,有时数据不正确等等。

有什么方法可以创建或向服务器请求 TransactionScopedEntityManager?我已经搜索过 Wildfly 源代码,但找不到。

此外,任何其他实现此目标的方法都将受到赞赏。

谢谢和亲切的问候。

【问题讨论】:

  • 这听起来更像是你想要一个RoutingDataSource。或者您加载的不同配置文件取决于谁使用该应用程序

标签: java jpa entitymanager persistence-unit entitymanagerfactory


【解决方案1】:

您可以通过使用 Hibernate's Mulit tenant facilities 实现多租户,实现 MultitenantConnectionProviderCurrentTenantIdentifierResolver 需要访问您的会话/事务上下文。 这是关于Baeldung 的教程。

免责声明:我不熟悉 Wildfly,所以也许有一种本地方法可以做到这一点,类似于 Springs RoutingDataSource(请参阅问题中的 XtremerBaumers 评论)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-27
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多