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]> > >