2013-10-14 42 views
1

JPA中是否存在Hibernate filters的等效项? 以下休眠注释可以例如为了用于定义过滤器:用于Hibernate过滤器的JPA等效项

@Entity 
@FilterDef(name="minLength", [email protected](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来完成这项工作?

我没有找到任何认真和可靠的解决方案。 我分析了“”项目。然而,它的主页在两年前更新了,它的最后一个版本是0.4.0,它似乎不是一个可靠的解决方案。这不是一个标准,它不受欢迎。

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

org.hibernate.Interceptor.onPrepareStatement(String sql) 

或以下的方法可以被覆盖:

org.hibernate.EmptyInterceptor.onPrepareStatement(String sql) 

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

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

回答

0

在我看来,你正试图对实体对象执行验证。你有几个选择来完成这一点。

第一是使用的Java API验证和及其相关验证。这是Java EE推荐的方法,JPA是其中的一部分。例如,你可以写你的实体类,如下所示:

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

现在,你每次坚持的Person实例时,JPA提供者会自动验证该情况下,只要有一个Java验证在classpath 。验证错误将作为运行时异常抛出,并可用于回滚事务。也可以手动调用验证器,收集任何验证错误,并根据需要将它们转换为用户友好的消息。

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

+0

我认为这个回答与问题无关。 @km询问在读取数据期间是如何过滤的,并且您正在引用在写入过程中验证它。 – Julio

+0

答案的要点是JPA事件。 JPA还提供了与读取相关的事件('@ PreLoad'和'@ PostLoad',所以对于读取来说答案也是非常有效的。 – manish