0

現在、春に作成したデータアクセス層をテストしています(PersistenceContextが挿入されています)。したがって、データベースにデータを挿入/削除/更新するUserServiceなどのサービスを呼び出すステートレスEJBがあります。

サービスは正常に動作し、データベースを挿入できました。しかし、テストしていて、設定した長さよりも長い文字列値を入力したとき、次のようになりました。

javax.transaction.RollbackException: Transaction marked for rollback.
WARNING: DTX5014: Caught exception in beforeCompletion() callback:
javax.persistence.PersistenceException: org.hibernate.exception.DataException: ERROR: value too long for type character varying(20)
Caused by: org.hibernate.exception.DataException: ERROR: value too long for type character varying(20)
Caused by: org.hibernate.exception.DataException: ERROR: value too long for type character varying(20)

私の部分的なコード:

@PersistenceContext
protected EntityManager entityManager;

try {
    entityManager.persist(e);
} catch(Exception e) {
  //log message here
}

次に、これらのエラーをキャッチするためにすべてを試しましたが、できませんでした。問題を解決する方法について何か提案はありますか?

ありがとう、
czetsuya

4

1 に答える 1

1

次のコードを使用して、状況でスローされるエラーを確認しました。

BEGIN;
CREATE TABLE t(v varchar(5));
DO $body$
BEGIN
  INSERT INTO t VALUES ('1234567');
EXCEPTION WHEN OTHERS THEN
  RAISE NOTICE '!!! %, %', SQLSTATE, SQLERRM;
END;$body$;
ROLLBACK;

ご覧のとおり、エラーコードはです。エラーは、 PostrgeSQL のエラー コードのリストに従って命名22001されています。string_data_right_truncation

Hibernate でこのエラーをキャッチする方法はわかりませんが、PL/pgSQL レベルでは次を使用して実行できます。

EXCEPTION WHEN SQLSTATE '22001' THEN
    -- your code follows
END;

これがお役に立てば幸いです。

于 2012-05-17T09:14:38.480 に答える