0

Fooいくつかの一意の制約を持つ sql テーブルにマップするentityがあります。そのため、保存にFoo失敗する場合があります。私はFooDao保存するために使用していますFoo

@Repository
public class FooDao
{
  @Autowired
  private SessionFactory sessionFactory;

  @Transactional
  @Override
   public void add(Foo item) {
    sessionFactory.save(item);
   }
}

メソッドを呼び出すとFooDao#add(Foo)、次の 2 つの理由で失敗する可能性があります。一意の制約違反 (この場合、問題の処理方法を知っています) またはその他の問題 (この場合、おそらく例外を伝播する必要があります) のいずれかです。この 2 つの状況をどのように区別すればよいでしょうか。

メソッドfind(Foo item)を追加FooDaoして、追加しようとしていたアイテムのようなものがデータベースであるかどうかを確認できます。しかし、これにはデータベースからの追加の選択が必要であり、私はこれについて少し心配しています.

4

4 に答える 4

1

それは実際には SQLState です。

このようなことをする

Catch(HibernateException he){
   SQLException sqe = he.getSQLEception();
   String sqlState = sqe.getSQLState();
   if(sqlState.equals("23000"){
       // Handle your exception
   } 
}

Java doc: SQLState - 例外を識別する XOPEN または SQL:2003 コード

ISO sqlStatesで見つけた1つのリンク、

参照へのリンク

しかし、正確な参照と値を探してください..

于 2012-10-09T14:03:19.747 に答える
0

org.hibernate.JDBCException をキャッチします。これには getErrorCode() があります。一意の制約違反の場合、ORA-00001。

-マディ

于 2012-10-09T13:20:35.320 に答える
0

データベース例外がある場合、チェック例外であるHibernateExceptionにキャッチされます。これをチェックされていないDataAccessExceptionSpringにラップします。この例外は、ブラウザとログ ファイルのスタック トレースで終了します。この例外をキャッチして印刷すると、何が起こっているかを確認できます。これにより、少なくとも何が実際に壊れているかを知ることができます。ControllerServlet

不良キーはおそらく 1 つの問題です。しかし、悪い値はおそらく別のものです。null 以外のフィールドの一部が null である、または何かが十分に長くない/短いなど。これを修正するには、おそらく検証が必要です。Hibernate Validatorを使用できます。フィールドに気の利いた注釈を付けると、データベースに到達する前にJavaで検証エラーが発生します-エラーはより速く発生します.

于 2012-10-09T17:43:41.363 に答える
0

1 つの明白な (しかし厄介な) 解決策は、javax.persistence.PersistenceException をキャッチし、エラー メッセージを解析して「違反」または「制約」を検出することです。

私の観点からは、事前に選択/検索を行う必要があります。ORM を使用していることを忘れないでください。Hibernate にはキャッシュが含まれているため、select/find エラーも key contraint エラーも実際の db クエリの結果ではない可能性がありますが、既にキャッシュにロードされたデータに基づく Hibernate の計算の結果である可能性があります。

セバスチャン

于 2012-10-09T13:05:09.063 に答える