当前位置: 首页 > 面试题库 >

Spring + Hibernate + JPA +多个数据库

封弘伟
2023-03-14
问题内容

我有一个Spring + Hibernate +
JPA应用程序。用户登录时,可以从要连接的数据库列表中进行选择(这是要求)。所有数据库都有相同的架构,因此将使用相同的实体和DAO。

现在,我有一个EntityManager(目前正在使用一个数据库),它被注入到DAO中,如下所示:

@PersistenceContext
private EntityManager entityManager;

有什么方法可以让DAO根据从服务层接收到的参数/属性自动接收entityManager(由Spring管理)?(Web层发送一种上下文,所选数据库的名称/代码/
ID将在其中)。

还是我必须亲自管理(创建所有的entityManager,将它们放置在地图中,并告诉DAO每个调用使用哪一个)?

在问这个问题之前,我进行了一些研究,但结果尚无定论-大多数问题涉及一个模型,该模型分布在2个或多个DB上,并且涉及跨多个DB的事务,但对我而言并非如此。

就我而言,一旦用户连接,就好像他连接到只有一个实体管理器的应用程序一样,该实体管理器就是他选择的数据库。DB的中间会话或任何其他类似的东西之间没有切换。

谢谢。


问题答案:

此功能称为多租户。

Hibernate 4应该开箱即用地支持它,尽管我不确定它是否可以与Spring-managed集成EntityManager

或者,最简单的方法是在某个ConnectionProvider级别或DataSource某个级别拦截数据库连接的创建,然后根据存储在ThreadLocal变量中的租户标识符选择合适的数据库。

也可以看看:

  • 多租户设计
  • Hibernate中的多租户


 类似资料:
  • 问题内容: 我正在尝试配置Spring + Hibernate + JPA以使用两个数据库(MySQL和MSSQL)。 我的datasource-context.xml: 每个persistence.xml包含一个单元,如下所示: PersistenceUnitManager导致以下异常: 如果只留下一个没有列表的persistence.xml,则每个列表都可以正常工作,但我需要2个单元… 我还尝

  • 问题内容: 我必须在Hibernate,Jpa的应用程序(弹簧)中使用两个不同的数据库。我想直接将不同的表定义为不同的数据源。所以我使用两个不同的持久性单元,然后尝试使用 和 将不同的表放入不同的包中。但这不起作用。用第一个数据源来影响所有表。然后我尝试将诸如类的名称写入持久性XML文件 和it.two.app.domain.second.OtherTable 但是,当我运行Log时,说表’fir

  • 我有相同的数据库模式database_1和database_2,希望对这两个数据库进行配置(database schema相同),并确定使用哪个数据库的运行时<我的坚持。xml如下所示: 持久性名称第二个配置如下: 两个持久性单元加载相同的类。现在我的数据库配置。xml作为配置持久化单元和数据源的地方。如下所示,第一个持久化单元名称配置为,数据源名称为datasource: 现在,此代码用于将第二

  • 描述:com.cavion.services.UserDataService中得字段userDataRepo需要一个名为“Entity ManagerFactory”得bean,但找不到该bean.操作:考虑在您的配置中定义一个名为'Entity ManagerFactory‘的bean。 我需要在我的JPA存储库上指定entityManagerFactoryRef。 但是我有许多存储库类,其中一

  • 我正在使用spring数据jpa为我的服务实现多事务(数据库),带有两个持久的单元名。并在Jboss 6.4 EAP中部署 以下是我的服务详情 在Jboss中,我无法部署它,我遇到以下异常: 原因:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有com.test.demo.domain.repository.Tb

  • 我无法解决这个问题。我得到了“线程中的异常”main”org.hibernate.LazyInitializationException:未能延迟初始化角色集合:org.sandy.domain.Location.items,没有会话或会话被关闭”我知道会话已关闭,但tx: notionation-drive@Transactional应该确保打开会话。它可以很好地与EAGER获取一起工作。哦,是