如何在Hibernate拦截器中获取Hibernate会话?

萨沙什语:

如何在Hibernate拦截器中获取Hibernate会话?

我正在尝试使用Hibernate通过组织ID透明地强制执行数据访问。我设置了一个全局筛选器,以按组织ID筛选所有查询。现在,在保存/更新之前,我需要使用实体拦截器在所有实体上设置组织ID。

组织ID来自HttpSession

我已经将组织ID设置为Hibernate会话中的Filter属性,我想在我的拦截器中检索该ID,并将其用于所有插入和更新。问题是我似乎无法访问Interceptor内部的Session。有任何解决方法吗?

尼古拉斯:

可以,但是我会使用简单的POJO来保持事物的清晰分离。请记住,存储在单例中的值只能由处理servlet请求的同一线程访问,因此,如果进行任何异步,则需要考虑这一点。这是一个超级基本的提示:

public class OrgId {
   public static ThreadLocal<Integer> orgId = new ThreadLocal<Integer>();
}

由于组织ID位于会话中,因此您可以在早期的servlet过滤器中设置ThreadLocal的值,如下所示(无需太多错误检查):

public class OrgIdFilter implements Filter {
   public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain) throws java.io.IOException, javax.servlet.ServletException {
      int orgId = 0;
      HttpServletRequest req = (HttpServletRequest) servletRequest;
      HttpSession session = req.getSession();
      orgId = Integer.parseInt(session.getAttribute("OrganizationalIdAttr"));
      try {
         OrgId.orgId.set(orgId);
         filterChain.doFilter(servletRequest, servletresponse);
      } finally {
         OrgId.orgId.set(null); // Important to clear after request !!
      }
   }
}

假定在调用过滤器时orgId在会话中,但是如果没有,您就会明白...。

然后在您的拦截器(或几乎任何地方)中,您可以通过以下方式获取线程的当前orgId:

OrgId.orgId.get();   // Might be null.....

这里的一个潜在问题是所有这些组件(过滤器,OrgId和拦截器)都需要由同一类加载器加载,以确保OrgId类实际上是单例,否则,不会有多个ThreadLocal实例挂在周围始终如一或根本没有工作。不用说,所有这些都需要在同一VM中发生。

我不确定这是否是解决此问题的最干净的方法,但是它确实将orgId带到您需要的位置。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在CXF拦截器中访问Servlet会话?

如何在Spring 3的Java配置中连接Hibernate 4拦截器?

如何在 $.ajaxSetup ajax 拦截器中获取 URL

如何在Spring Boot中使用Spring托管的Hibernate拦截器?

在springboot使用Hibernate拦截器的问题

如何在 Spring-Integration 的拦截器中获取消息头

如何在拦截器Angular中获取请求的查询参数

如何在NestJS拦截器中获取处理程序路由(对于Express和Fastify)

如何在 gRPC 流拦截器中获取消息值

如何在httpProvider responseError拦截器中传播错误

如何在gRPC拦截器中访问消息请求?

如何在Spring Boot中配置拦截器?

如何在ktor中创建可重用的拦截器?

如何在AngularJS中访问拦截器的'config'对象

如何在SwaggerUIBundle中设置请求拦截器?

Hibernate 中特定于实体的侦听器/事件/拦截器

如何在ByteBuddy中的类中添加字段并在方法拦截器中设置/获取该值

Hibernate JPA拦截器未收到呼叫

如何在EJB拦截器的生命周期事件方法中获取调用者名称

NestJs-如何在拦截器上获取请求主体

如何在雅加达 EE9 的计时器中实现拦截器

如何从 CXF 请求拦截器中的 SoapMessage 获取 WSDL 操作名称

如何使用Jersey拦截器获取请求正文

如何在获取当前的Hibernate会话时修复NullPointerException

如何在拦截器android改造中检查令牌过期?

如何在Struts2中配置范围模型驱动的拦截器

如何在springboot中向一个特定的url添加拦截器?

如何在Struts2拦截器中配置HTTP响应标头?

如何在Angular拦截器中向请求主体添加内容?