2017-07-01 1 views
1

私はPostgre 9.5でHibernate 5.2を使用しています。 My DBスキーマにはいくつかの制約があります。エンドユーザに制約名を公開する可能性はありますか?私はユニーク制約SQLが制約に当たったときのHibernateからの意味的な例外

ALTER TABLE JobTable 
    ADD CONSTRAINT JobTableJobStatusEnum 
CHECK (jobStatus IN ('JobSubmitted', 'JobRunning', 'JobFailed', 'JobKilled', 'JobSucceeded')); 

を持っている想像し、私は ConstraintViolationException(「操作を実行できません。あなたのクエリがJobTableJobStatusEnumを壊す」)

うん、それはどんなをすることはありませんのような再投何かしたいですビジネスユーザーにとっての感覚ですが、他の開発者はこの問題を理解するでしょう。 DBから制約定義を取得して例外メッセージに入れることもできます。

答えて

1

基本的に、例外のスタック情報に制約情報があります。

あなたは元の例外をラップして(それはそれだけで例外メッセージを変更するのカスタムではありません)何かのカスタムを追加する必要がある場合、あなたはConstraintViolationExceptionキャッチ(または例外を、それがApacheのコモンズ・ラングExceptionUtilsのutilのでConstraintViolationExceptionによって引き起こされますことを確認する)ことができます

mysqlの(Postgreは似たようなことがなければならないため)それは

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationExceptionのように見えるために

catch(ConstraintViolationException e){ 
    Strign message = e.getCause().getMessage(); 
    ..... 
    work with message 
    String detailMessage = String.format("Can't execute operation. Your query breaks %" , message); 
    throw new ConstraintViolationException(detailMessage , e); 
} 

キー 「UK_n7ihswpy07ci568w34q0oi8he」

ため 重複エントリ「[email protected]」あなたはあなたのDBにConstraintViolationのフォーマットのメッセージがわかっている場合は、例外メッセージメソッドから制約名を取得することができます。

+0

ええと、私はそれを見ましたが、例外を解析してstacktraceを分析するのは面白いです。私はいくつかのライブラリ/拡張機能を探しています。 – Sergey

+0

あなたは既にこの例外を持っています - すべての情報を含むMySQLIntegrityConstraintViolationException。制約に関するexception.getMessageの詳細を取得するだけです。 – xyz

関連する問題