java - Hibernate 过滤器的 JPA 等效项

标签 java spring hibernate security jpa

Hibernate filters 等效吗存在于 JPA 中吗? 例如,可以使用以下 hibernate 注释来定义过滤器:

@Entity
@FilterDef(name="minLength", parameters=@ParamDef( name="minLength", type="integer" ) )
@Filters( {
    @Filter(name="betweenLength", condition=":minLength <= length and :maxLength >= length"),
    @Filter(name="minLength", condition=":minLength <= length")
} )
public class Forest { ... }

我想使用 JPA 中的等效内容来限制对某些实体的读取访问。如何使用干净的 JPA 而不使用 Hibernate 注释来完成此操作?

我没有找到任何严肃可靠的解决方案。 我分析了“JPA Security”项目。然而,它的主页上次更新是在两年前,最后版本是0.4.0,它似乎不是一个可靠的解决方案。它不是标准,也不流行。

在我的情况下,Hibernate 中可用于限制对实体的读取访问的其他替代方案是 Hibernate Interceptor API - 可以实现以下接口(interface)方法以附加包含一些附加条件的 SQL 字符串:

org.hibernate.Interceptor.onPrepareStatement(String sql)

或者可以重写以下方法:

org.hibernate.EmptyInterceptor.onPrepareStatement(String sql)

我发现有一些JPA事件回调和注释,例如@PostLoad。但是,这些都不能在我的情况下使用,因为我需要一些东西来根据某些条件(用户角色)限制对实体的访问。

有人知道如何使用 JPA 标准来完成它吗?

最佳答案

在我看来,您正在尝试对实体对象执行验证。您有几种选择来完成此任务。

第一种方法是使用 Java Validations API 及其关联的验证。这是 Java EE 的推荐方法,JPA 是其中的一部分。例如,您可以按如下方式编写实体类:

@Entity
class Person {
  @NotNull
  @Size(min = 5, Max = 50)
  String name;
}

现在,每次您尝试保留 Person 的实例时,JPA 提供程序都会自动验证该实例,前提是类路径上有 Java validator 。验证错误将作为运行时异常抛出,并可用于回滚事务。如果需要,还可以手动调用 validator ,收集任何验证错误并将其转换为用户友好的消息。

另一个(可能是肮脏的)选项是使用 JPA 事件监听器,执行验证并在验证失败时抛出异常。这将立即终止 JPA 操作并回滚所有事务。

关于java - Hibernate 过滤器的 JPA 等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19361166/

相关文章:

java - 我应该使用哪种类型的 jdk 来开发我的应用程序?

Java - 对象到固定字节数组

java - 相同的元素被插入到java中的LinkedList中

spring - 具有 Spring 应用程序上下文的 JUnit 自定义运行器

java - DWR 和 Spring 拦截器设置

java - 如何动态地将对象添加到 Hibernate 查询中

java - 创建不同的类,一个CarDemo类和一个Car类

angularjs - AngularJS 自定义响应头的 Access-Control-Expose-Headers 配置

hibernate - 在构造函数中使用多对一集合的 SELECT NEW() - HQL

spring - 使用 JPA 2.0 和 @OneToMany 删除孤立实体的解决方法是什么?