Hibernate 5.6.0中如何通过代码注册FilterDefinition?(Hibernate 3.6.10升级场景)
我之前在升级Hibernate到5.6版本时也碰到过这个问题,原来基于Configuration的FilterDefinition注册方式在新版本里确实被调整了,不过有两种靠谱的代码注册方式可以替代,下面给你详细说明:
代码注册FilterDefinition的实现方式(Hibernate 5.6.0)
在Hibernate 5.x之后,官方对SessionFactory的构建流程做了重构,原有的Configuration类部分API被标记为过时,注册FilterDefinition需要通过MetadataSources和SessionFactoryBuilder来完成,具体步骤如下:
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




