You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Hibernate 5.6.0中如何通过代码注册FilterDefinition?(Hibernate 3.6.10升级场景)

我之前在升级Hibernate到5.6版本时也碰到过这个问题,原来基于ConfigurationFilterDefinition注册方式在新版本里确实被调整了,不过有两种靠谱的代码注册方式可以替代,下面给你详细说明:

代码注册FilterDefinition的实现方式(Hibernate 5.6.0)

在Hibernate 5.x之后,官方对SessionFactory的构建流程做了重构,原有的Configuration类部分API被标记为过时,注册FilterDefinition需要通过MetadataSourcesSessionFactoryBuilder来完成,具体步骤如下:

1. 先构建FilterDefinition实例

首先创建你需要的过滤规则定义,比如带参数的多租户过滤器:

// 定义过滤器名称、SQL片段和参数类型映射
FilterDefinition tenantFilterDef = new FilterDefinition(
    "tenantFilter",
    "tenant_id = :tenantId",
    Collections.singletonMap("tenantId", StandardBasicTypes.LONG)
);

2. 方式一:通过MetadataSources注册(推荐)

在初始化Metadata的阶段直接添加自定义FilterDefinition,这是官方推荐的构建流程:

// 初始化服务注册器
StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
    .configure() // 加载hibernate.cfg.xml配置
    .build();

// 初始化MetadataSources并注册FilterDefinition
MetadataSources metadataSources = new MetadataSources(serviceRegistry);
metadataSources.addFilterDefinition(tenantFilterDef);

// 构建Metadata和最终的SessionFactory
Metadata metadata = metadataSources.buildMetadata();
SessionFactory sessionFactory = metadata.buildSessionFactory();

3. 方式二:通过SessionFactoryBuilder注册

如果已经有了构建好的Metadata实例,也可以在SessionFactory构建的最后阶段添加:

// 基于已有的Metadata构建SessionFactory时注册FilterDefinition
SessionFactory sessionFactory = metadata.getSessionFactoryBuilder()
    .addFilterDefinition(tenantFilterDef)
    .build();

额外说明

注册完成后,你可以像旧版本一样在Session中启用过滤器:

Session session = sessionFactory.openSession();
// 启用过滤器并设置参数
session.enableFilter("tenantFilter").setParameter("tenantId", 1001L);
// 执行查询时会自动应用过滤规则
List<Entity> entities = session.createQuery("from Entity", Entity.class).list();

内容的提问来源于stack exchange,提问作者Amir Pashazadeh

火山引擎 最新活动