2012-05-17 1 views
0

В настоящее время я тестирую уровень доступа к данным, который я создал весной (вставляется PersistenceContext). Таким образом, у меня есть ESI-сервер без состояния, который вызывает службу, например UserService, которая вставляет/удаляет/обновляет данные в базе данных.Как поймать значение PSQLException слишком долго для символа типа, изменяющегося

Служба работает нормально, я смог вставить базу данных. Но когда я тестировал и вводимое значение я строка, которая длиннее заданной длины я получил:

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

+0

* Я не смог * не является сообщением об ошибке, которое я видел раньше. Что именно не сработало. Покажите нам код, в котором вы попытались поймать ошибку и объясните, почему вы «не смогли» ее поймать. –

+0

Код прямо там: entityManager.persist (e), проблема в том, что я вставляю значение, которое слишком велико для поля, например name (5), затем вставляю namenamename. Даже если я включил метод persist() с try/catch, он не смог поймать ошибку. – czetsuya

+0

Я до сих пор не вижу попыток/улов в коде. И вы все еще не объяснили, почему вы не можете его поймать. –

ответ

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; 

Вы увидите, что код ошибки 22001, ошибка называется string_data_right_truncation за PostrgeSQL's list of error codes.

Я не знаю, как поймать эту ошибку в Hibernate, но на PL/pgSQL level вы можете сделать это с помощью:

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

Я надеюсь, что это поможет.

+0

Спасибо за ответ, хм, но я не могу это использовать, так как ошибка происходит в коде не на хранимой процедуре: -? – czetsuya

+0

В первом блоке кода я завернул оператор 'INSERT' в анонимный блок кода. Да, такая обработка возможна только в хранимых процедурах. Но, может быть, вы также можете использовать 'SQLSTATE' в Hibernate? .. – vyegorov

Смежные вопросы