我正在为我的Web应用程序使用Spring MVC和HiberNate。我正在寻找一种方法来创建一种全局Hibernate过滤器,该过滤器将应用于我的DAO类中的每个查询,而不必在每个DAO方法中显式启用它。
要求按用户选择的会话变量过滤记录。因此,我们的查询参数将保存在会话中,该会话中的所有DAO查询都需要通过该变量过滤结果。这里的目的是避免每个DAO方法中的所有可重复过滤代码。
欢迎任何想法!
把我处理这个问题的方式放在这里。以下是基于与@Rp的讨论以及此处提出的建议。
三个主要元素参与了配置:< br> - Spring的会话范围bean < br >-package-info . Java < br >-Spring AOP < br > < br >
我创建了一个会话范围的 Spring bean,它将保存我的用户选择的变量。该变量将根据用户的请求通过 spring 控制器映射方法进行修改。由于被保存在 Spring 管理的 bean 中,借助 spring 的依赖注入,我可以在应用程序中的任何位置访问会话变量。
@Component
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class SessionParam implements Serializable{
private String sessParam;
..
..
}
接下来,我在包级别定义了我的hibernate过滤器。这是在< code>package-info.java文件中完成的。因此,这个包中的所有实体都继承了这个过滤器。
@FilterDef(name="GLOBAL_FILTER", parameters = {@ParamDef(name="sessParam", type="string")},
defaultCondition = "sessParam = :sessParam")
package com.company.app.entity;
import org.hibernate.annotations.FilterDef;
import org.hibernate.annotations.FilterDefs;
import org.hibernate.annotations.ParamDef;
< br >包中的实体使用hibernate的@Filter注释进行注释,如下所示:
@Entity
@Filter(name="GLOBAL_FILTER")
@Table(name = "TABLE_XYZ", schema = "SCHEMA_ABC")
public class TableXyz implements Serializable {
...
}
最后,使用hibernate的会话工厂的getCurrentSession()方法上的AspectJ方面拦截所有的DAO查询。
下面是方面类。
@Aspect
@Component
public class GlobalFilter {
@Autowired
SessionParam sessionParam;
@Pointcut("execution(* org.hibernate.SessionFactory.getCurrentSession(..))")
protected void hibernateSessionFetch(){
}
@AfterReturning(pointcut = "hibernateSessionFetch()", returning = "result")
public void enableGlobalFilter(JoinPoint joinPoint, Object result){
Session session = (Session) result;
session.enableFilter("GLOBAL_FILTER").setParameter("sessParam", sessionParam.getSessParam());
}
}
现在,对带有“GLOBAL_FILTER”的实体的所有查询都对所需变量进行了条件检查。DAO 方法中不需要在每个查询中进行显式条件检查。
我正在尝试使用Spring Boot和Spring数据通过鉴别器实现多租户。 我创建了一个抽象类来表示多租户实体。类似于此: 如何全局启用多租户Hibernate过滤器?
我们正在使用Spring boot+Spring data JPA和Hibernate开发一个多租户web应用程序。 多租户是通过拥有一个组织表来实现的,该表作为外键连接到几乎每个表上。这意味着每个DB调用(Spring Data repository查询方法)都必须用组织ID进行检查。 谢谢你抽出时间。
我看不到任何关于何时应该使用查询或过滤器或两者结合的描述。他们之间有什么区别?谁能解释一下吗?
我有一个查询,我需要过滤出结果。 这是我的查询 我得到一个错误,说注册[query]。我显然有一个筛选字段的查询。我遵循elasticsearch页面上筛选的查询文档中给出的格式。https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-filtered-query.html
嗨,最近我一直在研究REST API。我在想,如果没有参数,我怎么才能得到所有的数据。我只能通过categoryId获得数据,如下所示。http://..../categorys?categoryID=2数据被选择并显示如下。
如何在应用程序级别配置默认查询超时。我使用spring、hibernate和db2作为后端。在datasource级别设置超时不是一个选项,因为我们使用的是旧版本的IBM WebSphere。我尝试在事务管理器中配置defaultTimeout,但这没有帮助。我也不想集成c3p0连接池。hibernate是否为在应用程序级别设置全局查询超时提供了其他选项,如果是,如何配置。