2

我有一个在其设置器中进行验证的对象。例如:

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 查询尝试使用无效数据(例如Employee名称为“John Smith*”)实例化对象时,IllegalArgumentException会导致整个查询失败。对于这个特定的应用程序——加载缓存——理想的行为是 Hibernate 捕获异常,拒绝记录,并返回在初始化期间没有抛出任何异常的对象列表。

我知道许多替代解决方案:

  • 通过直接字段访问设置 Hibernate ,绕过设置器
  • 与其在 setter 中抛出异常,不如将对象标记为无效,然后将它们从返回的 List 中过滤出来org.hibernate.Query.list(),或者保存验证以备后list()返回。
  • 保证数据库数据的清洁(如果这在我的能力范围内!)

我的偏好是允许对象继续从 setter 中抛出异常,并避免对 Hibernate 结果进行后处理,并避免为 Hibernate 实例化的对象引入新的验证生命周期步骤。有没有办法做到这一点?

4

1 回答 1

0

不,在 Hibernate 中没有忽略这样的无声错误。在 SQL/HQL 级别过滤此类记录怎么样?就像是:

...
WHERE name NOT LIKE "%*%"

我知道 Hibernate 可以自动将此类过滤器应用于每个查询。另一种方法是有一个(物化的)视图。

当然,这种方法引入了一些重复(通常Employee类中的规则必须与 SQL 中的规则完全匹配),但它似乎仍然是最干净的方法。

于 2012-12-21T23:23:35.920 回答