mysql 查询休眠_所有数据库查询的全局休眠过滤器

本文介绍了如何利用Spring的会话bean、package-info.java和Spring AOP来配置一个全局过滤器。通过创建一个会话范围的bean来保存用户变量,并在Hibernate中定义过滤器,然后在AspectJ切面中拦截DAO查询,动态应用过滤条件,从而避免在每个查询中手动添加条件检查。
摘要由CSDN通过智能技术生成

小编典典

在这里说明我的处理方式。以下基于对@ Rp-的讨论以及此处提出的建议。

配置此功能的三个主要要素: -Spring 的会话范围内的bean -package - info.java -Spring AOP

我创建了一个 会话范围的Spring bean ,该 bean将保存用户选择的变量。该变量将根据用户的要求通过spring控制器映射方法进行修改。处于spring托管bean中,借助于spring的依赖注入,我可以在应用程序中的任何位置访问session变量。

@Component

@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)

public class SessionParam implements Serializable{

private String sessParam;

..

..

}

接下来,我在程序包级别定义 hibernate过滤器 。这是在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;

包中的实体使用hibernate的@Filter注释进行注释,如下所示:

@Entity

@Filter(name="GLOBAL_FILTER")

@Table(name = "TABLE_XYZ", schema = "SCHEMA_ABC")

public class TableXyz implements Serializable {

...

}

最后,使用Hibernate的会话工厂的getCurrentSession()方法中的 AspectJ 方面来拦截所有DAO查询。

下面是Aspect类。

@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方法中不需要在每个查询中进行显式的条件检查。

2020-06-01

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值