gpt4 book ai didi

spring - 在 hibernate/spring 中的多个模式之间分区数据

转载 作者:行者123 更新时间:2023-12-05 01:13:33 24 4
gpt4 key购买 nike

我们的应用程序区分特定“用户”(实际上是法人实体,但为简单起见我们将其称为用户)的数据和在所有用户之间共享的数据。要求将用户数据保存在每个用户的单独模式中。因此,在所有用户都可以访问的模式中存在公共(public)和共享的数据,以及许多模式,每个模式只能由与其相关的用户访问。这些用户模式都包含相同的一组表,因此我们可能在公共(public)模式中有类似 USERA.ACCOUNT、USERB.ACCOUNT(等等)和 SHARED.PRODUCT 的内容。我们已经实现了这一点,并通过为表示公共(public)数据的实体类型指定 @Table(schema="SHARED") 来很好地满足要求。我们不在“用户”实体类型上指定模式——要查找的模式的选择由 DAO 决定。每个用户都有一个 DAO,每个都配置为使用适当的用户模式,并根据与任何给定操作关联的用户“上下文”进行选择。

到目前为止一切顺利 - 但共享架构的名称现在已硬编码到共享数据类型的实体类文件中。因为它在注释中,所以被编译到它们中。这对我们不利,因为通常在客户端站点上部署时,我们发现客户端 DBA 希望指定模式名称,但我们不希望必须重新编译才能实现这一点。更糟糕的是,在客户站点,我们通常会有多个系统用于不同的目的,具有不同的模式名称(PROD、UAT 等),并且使用同一系统的多个重新编译的副本来做到这一点是疯狂的。

我一直无法找到一种方法来覆盖注释中定义的模式。有人知道实现这一目标的方法吗?我已经尝试将我们的系统从直接使用 hibernate(SessionFactory 等)移植到 JPA(EntityManagers 等),因为这原则上允许注释中的模式属性被 ORM.xml 中的条目覆盖,但似乎是使用 JPA/JTA/Spring 的问题很多,事务生命周期中的操作(例如刷新)不再像您预期的那样发生,所以我放弃了。

欢迎提出任何建议...

最佳答案

你有几个选择..您可以使用动态路由(查看 spring 文档,但在 stackoverflow 上也有很多帖子)。这是最适合您的解决方案..基本上,您配置了多个连接,并且基于某些标准,spring 将根据某些标准将您的查询路由到一个或另一个连接(模式)。基本上相同的 bean,根据需要由不同的模式获取。

其他选项是拥有多个具有相同结构的 bean,每个 bean 在 applicationcontext 中配置不同的实体管理器和事务管理器,但实际上这更适合与您不同的情况。

坦率地说,第一个解决方案我认为它足够简单并且最适合您的需求..查看此链接以获取示例或查看 spring 文档,它当时帮助我。 tutorial

关于spring - 在 hibernate/spring 中的多个模式之间分区数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24691317/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com