如何在 Spring 启动时激活 Hibernate @Filter?
How can I activate Hibernate @Filter in Spring boot?
我想要实现的最终目标是使用来自 请求 headers 的一些信息用于 Hibernate 过滤器.
Web 应用程序是一个相当整洁的 Spring 启动 webapp 使用 Jpa 存储库。
我在模型实体中配置了一个过滤器定义,我想在 webapp 上激活它。我使用请求处理程序:
实体:
@Entity
@Getter
@Setter
@Table(name = "personas")
@FilterDef(name = "filtro_personas", parameters = @ParamDef(name = "idparam", type = "int"))
public class Persona implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Filter(name = "filtro_personas", condition = ":idparam = id")
private Integer id;
private String nombre;
@OneToMany(mappedBy ="persona")
private List<Wallet> cuentas;
}
请求处理程序:
public class LangHeaderInterceptor implements HandlerInterceptor {
private EntityManager entityManager;
public LangHeaderInterceptor( EntityManager entityManager) {
this.entityManager = entityManager;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
if (entityManager != null ) {
// Sample of use of the filter.at this point the HttpServletRequest and entity manager are filled.
Session s = entityManager.unwrap(Session.class);
s.enableFilter("filtro_personas").setParameter("idparam", 1).;
}
return true;
}
}
请求处理器配置:
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
@Autowired
private EntityManager entityManager;
@Override
public void addInterceptors(InterceptorRegistry registry) {
WebMvcConfigurer.super.addInterceptors(registry);
//System.out.println("TRACING MESSAGE: CUSTOM INTERCEPTOR ADDED");
registry.addInterceptor(new LangHeaderInterceptor(entityManager));
}
}
嘿,朋友,你不能在不混合顾虑的情况下按照你尝试的方式做到这一点。您尝试的 InterceptorRegistry 用法是一个奇怪的地方(您不太可能在进入控制器方法的执行之前启动事务)。
Springboot
对 Hibernate
和 Jpa
界面的使用使得您的数据访问的实际会话仅在 @Transactional
的上下文中真正可用注释。
您应该按照您的意图执行 AOP 方法,这样您就可以抓住 transaction/session。
有关此事的一些链接:
我想要实现的最终目标是使用来自 请求 headers 的一些信息用于 Hibernate 过滤器.
Web 应用程序是一个相当整洁的 Spring 启动 webapp 使用 Jpa 存储库。
我在模型实体中配置了一个过滤器定义,我想在 webapp 上激活它。我使用请求处理程序:
实体:
@Entity
@Getter
@Setter
@Table(name = "personas")
@FilterDef(name = "filtro_personas", parameters = @ParamDef(name = "idparam", type = "int"))
public class Persona implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Filter(name = "filtro_personas", condition = ":idparam = id")
private Integer id;
private String nombre;
@OneToMany(mappedBy ="persona")
private List<Wallet> cuentas;
}
请求处理程序:
public class LangHeaderInterceptor implements HandlerInterceptor {
private EntityManager entityManager;
public LangHeaderInterceptor( EntityManager entityManager) {
this.entityManager = entityManager;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
if (entityManager != null ) {
// Sample of use of the filter.at this point the HttpServletRequest and entity manager are filled.
Session s = entityManager.unwrap(Session.class);
s.enableFilter("filtro_personas").setParameter("idparam", 1).;
}
return true;
}
}
请求处理器配置:
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
@Autowired
private EntityManager entityManager;
@Override
public void addInterceptors(InterceptorRegistry registry) {
WebMvcConfigurer.super.addInterceptors(registry);
//System.out.println("TRACING MESSAGE: CUSTOM INTERCEPTOR ADDED");
registry.addInterceptor(new LangHeaderInterceptor(entityManager));
}
}
嘿,朋友,你不能在不混合顾虑的情况下按照你尝试的方式做到这一点。您尝试的 InterceptorRegistry 用法是一个奇怪的地方(您不太可能在进入控制器方法的执行之前启动事务)。
Springboot
对 Hibernate
和 Jpa
界面的使用使得您的数据访问的实际会话仅在 @Transactional
的上下文中真正可用注释。
您应该按照您的意图执行 AOP 方法,这样您就可以抓住 transaction/session。
有关此事的一些链接: