我在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
在这两种情况下。 我认为有些东西不起作用。 救救我!
答案 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);
}
现在一切正常。 如果有人在这种方法中发现任何问题,请告诉我。