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 をセットアップし、セッターをバイパスする
  • セッターで例外をスローする代わりに、オブジェクトを無効としてマークし、から返されるリストからそれらを除外するorg.hibernate.Query.list()か、返された後の検証を保存しlist()ます。
  • データベースデータのクリーン度を保証します (これが私の力の範囲内であれば!)

私の好みは、オブジェクトが引き続きセッターから例外をスローできるようにし、Hibernate の結果に対して後処理を行うことを避け、Hibernate でインスタンス化されたオブジェクトに新しい検証ライフサイクル ステップを導入することを避けることです。これを行う方法はありますか?

4

1 に答える 1

0

いいえ、Hibernate で無視するようなサイレント エラーはありません。そのようなレコードを SQL/HQL レベルでフィルタリングするのはどうですか? 何かのようなもの:

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

私は、Hibernate がそのようなフィルターをすべてのクエリに自動的に適用できることを知っています。別のアプローチは、(具体化された) ビューを持つことです。

もちろん、このアプローチはいくつかの重複をもたらしました (一般に、Employeeクラスのルールは SQL のルールと正確に一致する必要があります) が、依然として最もクリーンな方法のようです。

于 2012-12-21T23:23:35.920 に答える