2011-01-07 18 views
1

我在我的applicationContextDataAccessException的不工作

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 

設置,我試圖抓住在ManagedBean的DataAccessException異常。 我有我設置@Transactonal的BusinessDelegate。

的問題是:

try 
    { 
     operazioneOk = businessDelegate.insertAuto(newAuto); 
    } 
    catch (DataAccessException e) 
    { 
     System.out.println("autoBean"); 
    } 

即使我沒有設置
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

但奇怪的是,在控制檯中我有此異常捕捉,工作:

AVVERTENZA: SQL Error: 0, SQLState: null 
GRAVE: L'operazione «batch» 0 insert into public.auto (marca, modello, anno, km, cilindrata, optional, prezzo, occasione, id) values (w, ww, w, w, w, w, w, 0, 12) è stata interrotta. Chiamare «getNextException» per scoprirne il motivo. 
AVVERTENZA: SQL Error: 0, SQLState: 23505 
GRAVE: ERROR: duplicate key value violates unique constraint "auto_marca_key" 
    Dettaglio: Key (marca)=(w) already exists. 
GRAVE: Could not synchronize database state with session 
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 

在這兩種情況下。 我覺得有些東西不起作用。 幫幫我!

回答

2

從堆棧跟蹤誤差

duplicate key value violates unique constraint "auto_marca_key" 
    Dettaglio: Key (marca)=(w) already exists. 

你插入包含違反唯一約束的列值的行。

+0

我知道:重複鍵是我的問題,但如果我趕上例外,我總是看到堆棧跟蹤並至少的System.out.println(「autoBean」); – 2011-01-08 10:35:56

0

好吧,我已經解決了自己的問題。

將該溶液設置@Transactional傳播。 這是我BusinessDelegate(SessionFacade)的方法:

@Override 
@Transactional 
public boolean insertAuto(Auto auto) 
{ 
    try 
    { 
     return (autoDao.create(auto) != null); 
    } 
    catch (DataAccessException e) 
    { 
     System.out.println("aa"); 
    } 
    return false; 
} 

而在DAO我必須設置:

@Override 
@Transactional(propagation = Propagation.REQUIRES_NEW) 
public PK create(T istance) throws DataAccessException 
{ 
    return (PK) sessionFactory.getCurrentSession().save(istance); 
} 

現在一切工作正常。 如果有人看到這種方法有任何問題,請諮詢我。