JPA相当于Hibernate过滤器

时间:2013-10-14 13:17:48

标签: java spring hibernate security jpa

JPA中是否存在Hibernate filters的等价物? 例如,可以使用以下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等效的东西来限制对某些实体的读访问。如何在没有Hibernate注释的情况下使用干净的JPA来完成它?

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

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

org.hibernate.Interceptor.onPrepareStatement(String sql)

或以下方法可以覆盖:

org.hibernate.EmptyInterceptor.onPrepareStatement(String sql)

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

任何人都知道如何使用JPA标准来完成它?

1 个答案:

答案 0 :(得分:0)

在我看来,您正在尝试对实体对象执行验证。你有几个选择来实现这一目标。

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

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

现在,每次尝试持久化Person的实例时,如果类路径上有Java Validator,JPA提供程序将自动验证实例。验证错误将作为运行时异常抛出,并可用于回滚事务。也可以手动调用验证器,收集任何验证错误,并在需要时将它们转换为用户友好的消息。

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