【问题标题】:How can I activate Hibernate @Filter in Spring boot?如何在 Spring Boot 中激活 Hibernate @Filter?
【发布时间】:2022-01-29 18:39:09
【问题描述】:

我想要实现的最终目标是使用 请求标头中的一些信息 用于 Hibernate 过滤器

webapp 是一个相当简洁的 Spring boot webapp,使用 Jpa Repositories。

我已经在模型实体中配置了一个过滤器定义,我想在 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));
    }
}

【问题讨论】:

  • 我愿意讨论这是否是设置过滤器激活的方法。我已经阅读了有关 AspectJ 以了解此意图的 AOP 实现。
  • 正在研究此事:dzone.com/articles/how-does-spring-transactional 我看到每次使用@Transactional 时都可能会创建一个新的 entityManager,所以也许我正在尝试修改 entityManager 或不会的会话正在使用中。
  • 洞察@Transactional 行为和内部:marcobehler.com/guides/…

标签: java spring-boot hibernate jpa


【解决方案1】:

嘿,朋友,你不能以你尝试的方式做到这一点,而不会混淆顾虑。您尝试的 InterceptorRegistry 用法是一个奇怪的尝试位置(您不太可能在进入控制器方法的执行之前启动事务)。

SpringbootHibernateJpa 接口的使用使得数据访问的实际会话仅在@Transactional 注释的上下文中真正可用。

您应该对您的意图执行 AOP 方法,以便捕获事务/会话。

关于此事的一些链接:

【讨论】:

    猜你喜欢
    • 2021-10-15
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 2020-06-01
    • 1970-01-01
    • 2017-11-29
    相关资源
    最近更新 更多