Java Hibernate:对数据库的所有请求应用特定列过滤

Java Hibernate:对数据库的所有请求应用特定列过滤,java,hibernate,hql,hibernate-criteria,Java,Hibernate,Hql,Hibernate Criteria,在我的数据库中,我有属于不同用户的数据。 在代码中,对数据库的请求通过不同的方式进行: 使用标准: 从代码中的一个位置(公共父DAO) 来自代码中的许多地方(儿童DAOs) 使用HQL查询: 两种方法相同 现在,我想确定的是,任何程序员,无论他以何种方式向DB发出请求,都不会犯错误,也不会忘记通过user\u id从任何表中过滤数据。该值是当前用户的id。(如果一个表没有这样的列,这意味着所有用户都可以访问它的数据,那么过滤应该被忽略) 理想情况下,这种过滤将在更深层次的某个地方自动

在我的数据库中,我有属于不同用户的数据。 在代码中,对数据库的请求通过不同的方式进行:

  • 使用标准:

    • 从代码中的一个位置(公共父DAO)

    • 来自代码中的许多地方(儿童DAOs)

  • 使用HQL查询:

    • 两种方法相同
现在,我想确定的是,任何程序员,无论他以何种方式向DB发出请求,都不会犯错误,也不会忘记通过
user\u id
从任何表中过滤数据。该值是当前用户的
id
。(如果一个表没有这样的列,这意味着所有用户都可以访问它的数据,那么过滤应该被忽略)


理想情况下,这种过滤将在更深层次的某个地方自动执行,而不是在我们编写和重写的代码中执行。有可能吗?

你可以这样做

  • 创建一个名为UserInterceptor的类,该类扩展EmptyInterceptor
  • 重写getEntityName方法
  • 获取实体类元数据。(您可以将sessionFactory注入EmptyInterceptor)
  • 获取属性并进行迭代,然后获取用户id
  • 重写onSave方法并在HQL生成的最终查询中检查用户id

  • 这可能不是理想的解决方案,但这样我们可以达到您的要求。

    您能详细说明一下吗?程序员可以查询或验证实体类,以检查表是否有user\U id列。@Lathy问题是程序员对实体类(每个)有一些事情要做-查询验证。他可能会忘记做这件事。违反用户数据安全的错误代价。获取当前正在使用的实体类的元数据,该元数据将为您提供其中使用的属性,您可以迭代该属性以查找该实体是否具有用户id,并根据结果应用过滤器。在拦截器/aop@Lathy这正是我问题的主题。