DataAccessException不起作用

时间:2011-01-07 23:11:57

标签: hibernate spring exception jsf

我在applicationContext中设置了

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

我尝试在ManagedBean中捕获DataAccessException。 我有BusinessDelegate,我设置@Transactonal。

问题是:

    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 个答案:

答案 0 :(得分:2)

堆栈跟踪的错误是

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

您正在插入一行,其中包含违反唯一约束的列值。

答案 1 :(得分: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);
}

现在一切正常。 如果有人在这种方法中发现任何问题,请告诉我。