2012-01-03 20 views
6

私はJPA/Hibernate(彼らに初心者)を使用しています。例外が発生した場合(ユニークな制約違反となる可能性があります)、スタックトレースを出力するのではなく、アプリケーションの意味を示すメッセージを表示する必要があります。JPA/Hibernate例外処理

Hibernateは例外についての情報(多分データベースに依存しない)を得るためのツールを提供していますか?

答えて

4

HibernateException は、実際の根本原因をカプセル化して、意味のあるユーザーフレンドリなメッセージを生成するのに十分な情報を提供することができます。ドキュメントのException Handlingセクションをお読みください。

0

Hibernateにおけるすべての例外は、JavaのRuntimeExceptionクラスの派生物です。したがって、コードでRuntimeExceptionをキャッチした場合、ExceptionクラスのgetCause()またはgetMessage()メソッドを呼び出すことによって例外の原因を取得できます。

1

特に、org.hibernate.exception.ConstraintViolationExceptionをキャッチできます。そうすれば、制約の問題だけを捉えていることが分かります。

2

あなたは一般的なJDBCExceptionをキャッチすることができ、次のいずれか

try { 
    userDao.save(user); //might throw exception 
} catch(JDBCException e) { 
    //Error during hibernate query 
} 

か、また、そのようなConstraintViolationExceptionJDBCConnectionExceptionなどJDBCExceptionのより具体的なサブクラスのいずれかをキャッチすることができます。

try { 
    userDao.save(user); //might throw exception 
} catch(ConstraintViolationException e) { 
    //Email Address already exists 
} catch(JDBCConnectionException e) { 
    //Lost the connection 
} 

e.getCause()方法基礎となるSQLExceptionを取得し、さらに分析することができます。

例えば印刷し

:あなたは次のように行うことができますDuplicate entry 'UserTestUsername' for key 'username'

2

。私はそれをしました。しかし、ベンダー固有のコードを使用しているので、別のJPSプロバイダを使用する場合は、いくつかの場所でコードを変更する必要があります。同時に、JPAプロバイダを簡単に変更したり、ユーザーフレンドリなエラーメッセージが重要であることを知っているときに、その実用的なことがあることがあります。

try{ 
... 
} 

catch(javax.persistence.PersistenceException ex) 

{ 

    if(ex.getCause() instanceof org.hibernate.exception.ConstraintViolationException) 

     {..........} 

}