与 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/