Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle JPA自动向每个查询添加一个条件_Oracle_Jpa - Fatal编程技术网

Oracle JPA自动向每个查询添加一个条件

Oracle JPA自动向每个查询添加一个条件,oracle,jpa,Oracle,Jpa,在做任何事情之前,我必须首先说:这张桌子的设计不是我的决定。我们抗议,但没有用,所以请不要告诉我,不要创建这样的表 我们有一个数据库,每个表都有一个标志。此标志用于指示此行所属的环境、生产或测试数据 对于服务器端,我们有一个变量,该变量当前存储在ThreadLocal中,用于指示该请求属于哪个环境,其值与数据库中的标志相同 我们的要求是,如果我的请求属于测试环境,那么我们必须只选择属于该环境的记录。我们需要在对数据库的每个查询中添加一个条件,例如: 从表t中选择t,其中t.flag=:envir

在做任何事情之前,我必须首先说:这张桌子的设计不是我的决定。我们抗议,但没有用,所以请不要告诉我,不要创建这样的表

我们有一个数据库,每个表都有一个标志。此标志用于指示此行所属的环境、生产或测试数据

对于服务器端,我们有一个变量,该变量当前存储在ThreadLocal中,用于指示该请求属于哪个环境,其值与数据库中的标志相同

我们的要求是,如果我的请求属于测试环境,那么我们必须只选择属于该环境的记录。我们需要在对数据库的每个查询中添加一个条件,例如:

从表t中选择t,其中t.flag=:environment

但在插入/更新到数据库之前,我们必须更新每个查询、更新每个对象以设置此标志。这将需要大量的努力,因为我们的系统早就建立起来了,而不是依靠进步。如果有人忘记将其添加到任何新查询中,这也会带来很大的风险

那么,是否需要插入一个条件来检查每个查询的标志值,而不必手动编辑查询字符串?像一个拦截器或者其他什么东西把这个条件放进去?

哪个JPA提供商

使用Hibernate,您可以尝试使用

可能是另一种选择,但在您的场景中可能有点过头了

最后,由于您使用Oracle标记了该问题,因此最简单的方法可能是为数据库中的每个表提供专用的模式(每个环境)和视图,并通过
标志
列进行过滤。不过,我不确定你是否被允许这样做


使用上面的一些方法,您需要一个全局变量来填充实体的
标志
字段,然后才能持久化实体

我们不允许有多个模式,也不允许有多个结构相同但名称不同的表。为什么?请不要问这件事,因为原因太愚蠢了。我想我明天会尝试@Filter,在他们准备语句时用Hibernate拦截器替换该值。这可能对我们很有效。今天太忙了,什么都没试。我会把结果a.s.a.p.还给你。谢谢你,这很有效。改为使用Where注释。但遗憾的是,MappedSuperclass注释不能与Where一起工作,因此我无法使用Where子句创建基类并让每个类都对其进行扩展。