【发布时间】: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