我们的应用程序区分特定"用户" (实际上是一个法律实体,但为了简单起见,我们将其称为用户)和所有用户之间共享的数据。要求用户数据保存在每个用户的单独模式中。因此,存在可在所有用户访问的模式中共享和共享的数据,以及许多模式,每个模式只能由与其相关的用户访问。这些用户模式每个都包含相同的表集,因此我们可能会在公共模式中使用USERA.ACCOUNT,USERB.ACCOUNT(等等)和SHARED.PRODUCT。我们已经实现了这一点并通过为表示公共数据的实体类型指定@Table(schema =" SHARED")来生成满足要求的东西。我们没有在" user"上指定架构。实体类型 - 要查看的模式选择由DAO决定。我们每个用户有一个DAO,每个DAO都配置为使用适当的用户模式,并根据用户" context"与任何给定的操作相关联。
到目前为止一切顺利 - 但共享模式的名称现在已硬编码到共享数据类型的实体类文件中。因为它在注释中被编译成它们。这对我们没有好处,因为通常在客户端站点上部署时,我们发现客户端DBA希望指定模式名称,但我们不希望为了实现这一点而重新编译。更糟糕的是,在客户端站点,我们通常会有多个系统用于不同的目的,具有不同的模式名称(PROD,UAT等等),并且使用同一系统的多个重新编译的副本来实现这一点将是疯狂的。
我无法找到覆盖注释中定义的架构的方法。是否有人意识到实现这一目标的方法?我已经尝试将我们的系统从直接使用hibernate(SessionFactory等)移植到JPA(EntityManagers等等),因为这在原则上允许注释中的schema属性被ORM.xml中的条目覆盖,但似乎有使用JPA / JTA / Spring时出现问题,因为事务生命周期中的操作(如flush)不再像您期望的那样发生,所以我放弃了。
任何建议都会受到欢迎......
答案 0 :(得分:0)
你有几个选项.. 您可以使用动态路由(检查spring文档,但在stackoverflow上也有很多帖子)。这是最适合您的解决方案.. 基本上,您已配置了SEVERAL连接,并且基于某些条件,spring会根据某些条件将您的查询路由到一个或另一个连接(架构)。基本上相同的bean,根据需要由不同的模式获取。
其他选项是让多个bean具有相同的结构,每个bean都有一个实体管理器和事务管理器,在applicationcontext中有不同的配置,但实际上这更适合你的不同情况..
坦率地说,第一个解决方案我认为它很简单,最适合您的需求.. 查看此链接以获取示例或查看spring doc,它当时集会帮助我。 tutorial