【问题标题】:Partitioning data between multiple schemas in hibernate/spring在hibernate / spring中的多个模式之间对数据进行分区
【发布时间】:2014-09-01 16:48:45
【问题描述】:

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

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

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

欢迎提出任何建议...

【问题讨论】:

    标签: spring hibernate annotations schema partitioning


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-09-09
      • 2011-02-14
      • 1970-01-01
      • 2016-08-16
      • 2019-02-20
      • 1970-01-01
      • 2011-04-14
      • 2017-04-26
      • 1970-01-01
      相关资源
      最近更新 更多