当前位置: 首页 > 面试题库 >

通过主键/外键搜索时启用休眠过滤器

韩鸿波
2023-03-14
问题内容

我使用spring数据并hibernate@ Filter / @
FilterDef来过滤软删除的实体。似乎springRepository.findOne(id)总是返回值,即使id被软删除。此方法以及通过外键搜索其他字段的where子句中不包含过滤器。在这种情况下是否可以启用过滤器,使其可以用作@Where注释?


问题答案:

我有同样的问题。我已经通过实现HibernatePersistenceProvider和HibernateEntityManagerFactory类解决了它。

public class FilterEnableHibernatePersistenceProvider extends HibernatePersistenceProvider {

    @Override
    public EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map properties) {
        return wrapEntityManagerFactory(super.createEntityManagerFactory(persistenceUnitName, properties));
    }

    @Override
    public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map properties) {
        return wrapEntityManagerFactory(super.createContainerEntityManagerFactory(info, properties));
    }

    private EntityManagerFactoryWrapper wrapEntityManagerFactory(EntityManagerFactory entityManagerFactory) {
        return entityManagerFactory == null
            ? null
            : new EntityManagerFactoryWrapper(entityManagerFactory);
    }


public static class EntityManagerFactoryWrapper implements HibernateEntityManagerFactory {

    //This is where the filters are being activated
    protected EntityManager initSession(EntityManager entityManager) {
        Session session = ((HibernateEntityManager) entityManager).getSession();
        if (session.getEnabledFilter(FILTER_NAME) == null) {
            Filter activeFilter = session.enableFilter(FILTER_NAME);
            activeFilter.setParameter("some_field", some_value);
        }
        return entityManager;
    }

    // wrapp other methods

}

在每次会话初始化之后,将启用过滤器。现在,您需要将FilterEnableHibernatePersistenceProvider添加到您的配置类中:

@Configuration
public class JpaConfiguration {

@Bean()
public LocalContainerEntityManagerFactoryBean entityManagerFactory(){
    LocalContainerEntityManagerFactoryBean emFactory = new LocalContainerEntityManagerFactoryBean();
    emFactory.setPersistenceProviderClass(FilterEnableHibernatePersistenceProvider.class);
    //yours configuration
}


 类似资料:
  • 问题内容: 我有这样的JPA实体类: 我需要这样的搜索方法 用法示例: 我对findAll方法的想法是 但这太丑陋了,看起来有些开销。谁能帮助我更礼貌地邀请该方法?我可以使用任何Java技术或框架。 问题答案: 所以您要寻找 原型 吗?Hibernate为此提供了一个方便的标准,因此,如果您不介意将自己与Hibernate API捆绑在一起,请尝试以下来自docs的示例: 它具体说: 版本属性,标

  • 问题内容: 我必须与Hibernate合作,但我不确定如何解决此问题,我有2个具有1..n关系的表,如下所示: 如何使用Hibernate进行管理? 我不知道如何声明将包含主键一部分的外键。 我的数据库架构是从Hibernate模型生成的。 问题答案: 我找到了解决此问题的两种方法。 第一个是一种解决方法,没有第二个那么整洁。 将实体的主键定义为包含,和的复合键,首先将假定为主键的内容定义为唯一约

  • 问题内容: 我使用Hibernate制作了一个示例应用程序。我的要求是表上没有主键。我只需要从应用程序中选择查询。我知道应该有一个主键,但是我所引用的表没有它。 它有大约5万条记录。因此,修改表以添加ID列将看不到可行的选项。 有可能吗 问题答案: Hibernate 要求 实体表具有主键。故事结局。 在谈论数据库时,5万条记录根本就不多。 我的建议:在表中添加一个自动增量整数PK列。您会对它的速

  • 问题内容: 我正在尝试根据的特定字段的值过滤Django中的表。 例如,我有两个模型: 我想根据相关项目的名称过滤我的资产列表。 目前,我正在执行两个查询: 我想知道是否有一种方法可以在主查询中指定这种过滤? 问题答案:

  • 问题内容: 目前,Hibernate允许我直接使用*对一关系定义的对象 是否可以获取外键而不是对象? 我看到的当前方法是在映射中添加addint: 是否有更好的方法来获取外键,或者这是唯一的方法? 问题答案: 是的,你可以这样做。您只需要清楚地告诉休眠状态,哪一个是应该维护的映射,如下所示:

  • 问题内容: 我想问一下是否有可能使用hibernate方式做到这一点。假设我已经运行了HQL并检索了一个集合。是否可以使用hibernate进一步过滤它? 我试图在标头类中使用,并在查询之前添加session.enable(),但似乎无法正常工作。 样例代码 精简HQL 问题答案: 不。至少不是您问的方式。一旦您要求Hibernate(使用方法)访问数据库,Hibernate就发挥了作用,结果现在