我有一个在其setter中进行验证的对象。例如:
class Employee {
private String name;
public void setName(String theName) {
if (theName.contains("*")) {
throw new IllegalArgumentException("You can't have an asterisk in a name!");
}
name = theName
}
}
当Hibernate查询尝试使用无效数据(例如名为“John Smith *”的Employee
)实例化对象时,IllegalArgumentException
会导致整个查询失败。对于这个特定的应用程序 - 加载缓存 - 理想的行为是Hibernate捕获异常,拒绝记录,并返回在初始化期间没有抛出任何异常的对象列表。
我知道许多其他解决方案:
org.hibernate.Query.list()
返回的List中过滤掉,或者在list()
返回后保存验证。我的偏好是允许对象继续从setter中抛出异常,并避免对Hibernate结果进行后处理,并避免为Hibernate实例化的对象引入新的验证生命周期步骤。有没有办法做到这一点?
答案 0 :(得分:0)
不,在Hibernate中没有忽略这样的静默错误。那么在SQL / HQL级别过滤这些记录呢?类似的东西:
...
WHERE name NOT LIKE "%*%"
我知道Hibernate可以自动将这种过滤器应用于每个查询。替代方法是拥有(物化)视图。
当然这种方法引入了一些重复(在Employee
类中的一般规则必须与SQL中的那些完全匹配),但它似乎仍然是最干净的方式。