在开始之前,我必须首先说一句:这个表设计不是我的决定。我们抗议但无济于事,所以请不要告诉我,不要创建这样的表格。
我们有一个数据库,每个表都有一个标志。该标志用于指示该行所属的环境,生产或测试数据。
对于服务器端,我们有一个变量,当前存储在ThreadLocal中以指示此请求所属的环境,该值与数据库中的标志相同。
我们的要求是,如果我的请求属于测试环境,那么我们必须仅选择属于该环境的记录。我们需要为我们对数据库的每个查询添加条件,例如:
SELECT t FROM TABLE t WHERE t.flag = :environment
但是我们必须更新每个查询,更新每个对象以在插入/更新到数据库之前设置此标志。由于我们的系统很早就已经建立,所以还需要很多努力,而不是正在进行中。如果有人忘记将其添加到任何新查询中,这也会带来很多风险。
因此,是否有插入条件来为每个查询检查此标志值而不必手动编辑查询字符串?像拦截器或其他可以放置这种条件的东西?
答案 0 :(得分:1)
哪个JPA提供商?
使用Hibernate,您可以尝试使用@Filter
。
Multitenancy可能是另一种选择,但在您的情况下可能会适得其反。
最后,由于您用Oracle标记了问题,最简单的方法也许是为专用模式(针对每个环境)提供数据库中每个表的视图,并按flag
列进行过滤。不过,不确定是否可以这样做。
使用上述某些方法之前,您需要全局entity listener来填充实体的flag
字段,然后再保留它们。