【发布时间】:2018-12-27 06:43:05
【问题描述】:
目前我们的数据库有两种模式,一种用于生产,一种用于测试,表相同但数据不同。
对于服务器端,我们使用 RoutingDatasource 来管理数据。每个请求都有一个参数来知道要访问哪个数据库,例如“prod”或“test”。然后将参数存储在 ThreadLocal 中。我们的 RoutingDatasource 将获取此参数,取决于值并返回正确的数据源。所以我们只需要一个映射实体和一个 CrudRepository 用于两个模式中的同一张表。
但出于某种(愚蠢的)原因,我们被要求将两种模式合并为一个模式,在每个表前都有一个前缀,如 PROD_TABLE1、TEST_TABLE1、PROD_TABLE2、TEST_TABLE2 等。
所以我想问一下,我们如何才能为具有此要求的每个表只保留 1 个实体、1 个存储库?我们不想克隆代码,创建太多类继承现有的只是为了映射到第二个表。 @SecondaryTable 似乎不是我们想要的。
=================================
更新 1:
我正在查看 PhysicalNamingStrategy,能够为表名添加前缀。但这只会在他们初始化 EntityManager 时运行一次。那么有没有其他方法可以为每个请求的表添加前缀?
=================================
更新 2: 我尝试这样的事情:
@Table(name = "##schema##TABLE1")
然后在我们的项目中添加一个 Hibernate 拦截器。在准备语句时,我们从 ThreadLocal 获取参数,然后将“##schema##”部分替换为正确的前缀。使用这种方式,一切正常,但我不太喜欢这种解决方案。
谁有更好的方法?
【问题讨论】:
-
我会在前一种情况下使用两个带有同义词或指向表的视图的空模式来恢复它。
-
@MarmiteBomber 我们的客户(雇用我们)不会给我们超过 1 个模式。如果我们有 2 个空模式,那么我们宁愿有 2 个模式分别用于生产和测试
-
好吧,你可能会说你不需要两个模式,而只需要两个数据库用户。
-
@MarmiteBomber 2 数据库用户?每个都可以使用不同的表?当这里的问题是我有不同名称但结构相同的表并且只想使用 1 个对象映射、1 个存储库时,这有什么帮助?你能告诉我更多吗?我也有解决办法,您可以查看我的更新,但仍在等待更好的解决方案
标签: oracle spring-boot jpa