【问题标题】:DataAccessException doesn't work数据访问异常不起作用
【发布时间】:2011-06-05 14:12:46
【问题描述】:

我已经在我的applicationContext中设置了

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

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

问题是:

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

问题,即使我不设置也可以工作
&lt;bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/&gt;

但奇怪的是,在控制台中我有这个异常:

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

在这两种情况下。 我认为有些东西行不通。 帮帮我!

【问题讨论】:

    标签: hibernate spring exception jsf


    【解决方案1】:

    堆栈跟踪的错误是

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

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

    【讨论】:

    • 我知道:重复键是我的问题,但如果我发现异常,我总是会看到堆栈跟踪,至少 System.out.println("autoBean");
    【解决方案2】:

    好的,我自己解决了这个问题。

    解决方案是设置@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);
    }
    

    现在一切正常。 如果有人发现这种方法有任何问题,请给我建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-24
      • 2015-10-10
      • 2016-01-24
      • 2021-04-08
      • 2017-04-05
      • 2017-05-16
      • 2017-09-11
      • 2011-11-19
      相关资源
      最近更新 更多