Oracle JPA自动向每个查询添加一个条件
在做任何事情之前,我必须首先说:这张桌子的设计不是我的决定。我们抗议,但没有用,所以请不要告诉我,不要创建这样的表 我们有一个数据库,每个表都有一个标志。此标志用于指示此行所属的环境、生产或测试数据 对于服务器端,我们有一个变量,该变量当前存储在ThreadLocal中,用于指示该请求属于哪个环境,其值与数据库中的标志相同 我们的要求是,如果我的请求属于测试环境,那么我们必须只选择属于该环境的记录。我们需要在对数据库的每个查询中添加一个条件,例如:Oracle JPA自动向每个查询添加一个条件,oracle,jpa,Oracle,Jpa,在做任何事情之前,我必须首先说:这张桌子的设计不是我的决定。我们抗议,但没有用,所以请不要告诉我,不要创建这样的表 我们有一个数据库,每个表都有一个标志。此标志用于指示此行所属的环境、生产或测试数据 对于服务器端,我们有一个变量,该变量当前存储在ThreadLocal中,用于指示该请求属于哪个环境,其值与数据库中的标志相同 我们的要求是,如果我的请求属于测试环境,那么我们必须只选择属于该环境的记录。我们需要在对数据库的每个查询中添加一个条件,例如: 从表t中选择t,其中t.flag=:envir
从表t中选择t,其中t.flag=:environment
但在插入/更新到数据库之前,我们必须更新每个查询、更新每个对象以设置此标志。这将需要大量的努力,因为我们的系统早就建立起来了,而不是依靠进步。如果有人忘记将其添加到任何新查询中,这也会带来很大的风险
那么,是否需要插入一个条件来检查每个查询的标志值,而不必手动编辑查询字符串?像一个拦截器或者其他什么东西把这个条件放进去?哪个JPA提供商
使用Hibernate,您可以尝试使用
可能是另一种选择,但在您的场景中可能有点过头了
最后,由于您使用Oracle标记了该问题,因此最简单的方法可能是为数据库中的每个表提供专用的模式(每个环境)和视图,并通过标志列进行过滤。不过,我不确定你是否被允许这样做
使用上面的一些方法,您需要一个全局变量来填充实体的标志
字段,然后才能持久化实体 我们不允许有多个模式,也不允许有多个结构相同但名称不同的表。为什么?请不要问这件事,因为原因太愚蠢了。我想我明天会尝试@Filter,在他们准备语句时用Hibernate拦截器替换该值。这可能对我们很有效。今天太忙了,什么都没试。我会把结果a.s.a.p.还给你。谢谢你,这很有效。改为使用Where注释。但遗憾的是,MappedSuperclass注释不能与Where一起工作,因此我无法使用Where子句创建基类并让每个类都对其进行扩展。