Dobry den,

domnivam se, ze systematictejsi by bylo zavest do aplikace krome validace 
vstupnich dat (formatu) 
take validaci na urovni dat. V teto fazi by se kontrolovala korektnost vstupu 
vzhledem k omezenim, 
ktera vyplyvaji z logiky datoveho modelu. 

Ve vasem pripade jde napr. o pozadavek na jedinecnost jmen uzivatele.

Muze se stat, ze jednou zmenite databazi anebo prejdete na novejsi verzi 
knihovny Spring
anebo zcela zmenite pouzitou technologii - a vyjimky budou vypadat uplne 
jinak...

mp.



-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Petr Gola
Sent: Monday, June 05, 2006 7:50 PM
To: Java
Subject: Spam:Re: Spring+Hibernate - obsluha vyjimek databaze

Mockrat dekuji.

Mam jeste jeden dotaz. Pokud obsahuje zaznam vice unique polozek - jsem schopen 
z vyjimky nejak zjistit, ktera "constraint" je duvodem?
Pripadne jak?

Vsiml jsem si na vystupu:
(util.JDBCExceptionReporter      72) ERROR: duplicate key violates
unique constraint "catalog_users_username_key"

Jak bych se mohl dostat k temto udajum programove? Abych primo v metode 
userDAO.saveUser(User usr) mohl zjistit, co bylo pricinou chyby (v tomto 
pripade poruseni kotvy catalog_users_username_key) a na zaklade toho pokracovat?

On 6/5/06, Kamil Podlesak <[EMAIL PROTECTED]> wrote:
> Petr Gola wrote:
>
> > Bohuzel, stale se nemohu dobrat k vysledku.
>
>
> Pricina je ta, ze Hibernate neprovede operaci v databazi ihned, ale az 
> pri ukonceni transakce (to je defaultni chovani), kdy se pokusi 
> provest vsechny zmeny najednou. V tomto pripade je pouzito Spring AOP, 
> kdy se commit provede pri ukonceni metody (viz ten stack trace) - a v 
> tom okamziku se vygeneruje vyjimka. Takze try-catch block uvnitr 
> samozrejme nic nechyti.
>
> Resenim je provest flush explicitne:
> getHibernateTemplate().flush()
>
> Take se da Hibernate nakonfigurovat aby flushoval vzdy, ale to ma 
> smysl jen pokud takovych situaci bude vice (a pak by mozna nebylo od 
> veci zamysleni, proc je business logika v databazi pod ORM).
>
> > implementace DAO:
> >
> > public class UserHibernateDAO extends HibernateDaoSupport implements 
> > IUserDAO {  public User saveUser(User usr) {
> >    getHibernateTemplate().saveOrUpdate(usr);
> >    return usr;
> >  }
> >  ...
> > }
> >
> > SLUZBA:
> >
> > public class UserSpringService implements IUserService {  private 
> > IUserDAO userDAO;
> >
> >  public User saveUser(User usr) {
> >    try {
> >      usr = userDAO.saveUser(usr);
> >    } catch (DataAccessException daex) {
> >      System.out.println("daex:"+daex);
> >      throw new ExistingUsernameException("Existing username!");
> >    }
> >    return usr;
> >  }
> >  ...
> > }
> >
> > No, bohuzel nevim, kde je problem, ale zadna 
> > ExistingUsernameException vyhozena neni, Tomcat vypise:
> >
> > (def.AbstractFlushingEventListener   300 ) Could not synchronize
> > database state with session
> > org.hibernate.exception.ConstraintViolationException: Could not 
> > execute JDBC batch update at
> > org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.
> > java:71)
> >
> > at
> > org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHel
> > per.java:43)
> >
> > at
> > org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java
> > :202) at 
> > org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235
> > ) at 
> > org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139
> > )
> > at
> > org.hibernate.event.def.AbstractFlushingEventListener.performExecuti
> > ons at org.hibernate.event.def.DefaultFlushEventListener.onFlush
> > at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985)
> > at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:333)
> > at
> > org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.jav
> > a:106)
> >
> > at
> > org.springframework.orm.hibernate3.HibernateTransactionManager.doCom
> > mit at org.springframework.transaction.support.AbstractPlatform...
> > at
> > org.springframework.transaction.support.AbstractPlatformTransactionM
> > anager.commit
> >
> > at
> > org.springframework.transaction.interceptor.TransactionAspectSupport.doCommit...
> >
> > at
> > org.springframework.transaction.interceptor.TransactionInterceptor.i
> > nvoke at 
> > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed
> > at org.springframework.aop.framework.JdkDynamicAopProxy.invoke
> > at $Proxy1.saveUser(Unknown Source)
> >
> > Ale pokud zavolam z klienta volam
> > try { userService.saveUser(usr) } catch(DataAccessException daex) ...
> > dostanu
> >
> > daex:org.springframework.dao.DataIntegrityViolationException:
> > Hibernate operation: Could not execute JDBC batch update; SQL 
> > [insert into ...
> >
> > Ale chtel bych tuto vyjimku osterit uz na strane serveru.
> >
>
>
> --
> Kamil Podlesak <[EMAIL PROTECTED]>
>
>

Odpovedet emailem