Re: Spring+Hibernate - obsluha vyjimek databaze
Je potreba si prostudovat, jak funguje springovsky preklad vyjimek http://static.springframework.org/spring/docs/1.2.x/reference/dao.html#dao-exceptions Vami zminovany kod, pravdepodobne vyhodi DataIntegrityViolationException viz http://static.springframework.org/spring/docs/1.2.x/api/org/springframework/dao/DataIntegrityViolationException.html Petr Gola napsal(a): Zdravim konferenci, pracuji na 3-vrstve aplikaci (Java Swing,Spring,Hibernate,PostgreSQL). Chtel bych se zeptat zkusenejsich, jak resi obsluhu business logiky z klienta (zpetna vazba, vyjimky). Priklad: Mam v aplikaci seznam uzivatelu, pricemz kazdy uzivatel ma svoje ID (primarni klic, generovane automaticky), USERNAME (je jedinecce: unique=true) a PASSWORD. Business logika ma sluzbu UsersService a pro pridani noveho uzivatele existuje metoda addUser(String username, String password). Klient se pripoji na tuto sluzbu a pro pridani uzivatele vola prave tuto metodu. V Hibernate mam definovanou polozku username jako unique=true. Pokud se klient pokusi pridat uzivatele s jiz existujicim uzivatelsky jmenem, vyhodi hibernate vyjimku, kterou ale zatim nevim jak odchytit a zpracovat. Jak resite tento problem? Melo by to nejspis byt takhle: na pozadavek klienta se business vrstva pokusi vytvorit (getHibernateTemplate.save()) uzivatele - pokud se ji to nepodari, da o tom informaci klientovi... predstavoval jsem si to jako predani vyjimky, jenze se mi nedari odchytit jiz vyjimku Hibernate, ze se uzivatele nepodarilo vytvorit, protoze uzivatel s takovym username jiz existuje. Jak pracujete s obsluhou databaze v Spring+Hibernate vy? -- S pozdravem Roman Dagi Pichlik /* http://www.sweb.cz/pichlik/ Blog pro kodery */ __ This email has been scanned by the MessageLabs Email Security System. For more information please visit http://www.messagelabs.com/email __
Re: Spring+Hibernate - obsluha vyjimek databaze
Dekuji vsem za odpovedi. Moje predstava je takova, ze bych v business vrstve obslouzil onu vyjimku DataIntegrityViolationException a na jejim zaklade vyhodil svoji vyjimku (treba ExistingUsernameException). Ale nedari se mi zachytit DataIntegrityViolationException vyjimku v DAO implementaci (bezi to asi ve zvlastnim vlakne a na moje try-catch to nebere ohled). Kde bych mel tuto vyjimku osetrovat? Dale by me zajimalo, jestli by z teto vyjimky nebylo mozne programove zjistit nejake podrobnejsi informace - napriklad, ze se to nepodarilo ulozit skutecne diky existujicimu username, nebo kvuli necemu jinemu (napr. spatne delce hesla atd... ). S pozdravem, Petr Gola On 6/5/06, Roman Pichlik [EMAIL PROTECTED] wrote: Je potreba si prostudovat, jak funguje springovsky preklad vyjimek http://static.springframework.org/spring/docs/1.2.x/reference/dao.html#dao-exceptions Vami zminovany kod, pravdepodobne vyhodi DataIntegrityViolationException viz http://static.springframework.org/spring/docs/1.2.x/api/org/springframework/dao/DataIntegrityViolationException.html Petr Gola napsal(a): Zdravim konferenci, pracuji na 3-vrstve aplikaci (Java Swing,Spring,Hibernate,PostgreSQL). Chtel bych se zeptat zkusenejsich, jak resi obsluhu business logiky z klienta (zpetna vazba, vyjimky). Priklad: Mam v aplikaci seznam uzivatelu, pricemz kazdy uzivatel ma svoje ID (primarni klic, generovane automaticky), USERNAME (je jedinecce: unique=true) a PASSWORD. Business logika ma sluzbu UsersService a pro pridani noveho uzivatele existuje metoda addUser(String username, String password). Klient se pripoji na tuto sluzbu a pro pridani uzivatele vola prave tuto metodu. V Hibernate mam definovanou polozku username jako unique=true. Pokud se klient pokusi pridat uzivatele s jiz existujicim uzivatelsky jmenem, vyhodi hibernate vyjimku, kterou ale zatim nevim jak odchytit a zpracovat. Jak resite tento problem? Melo by to nejspis byt takhle: na pozadavek klienta se business vrstva pokusi vytvorit (getHibernateTemplate.save()) uzivatele - pokud se ji to nepodari, da o tom informaci klientovi... predstavoval jsem si to jako predani vyjimky, jenze se mi nedari odchytit jiz vyjimku Hibernate, ze se uzivatele nepodarilo vytvorit, protoze uzivatel s takovym username jiz existuje. Jak pracujete s obsluhou databaze v Spring+Hibernate vy? -- S pozdravem Roman Dagi Pichlik /* http://www.sweb.cz/pichlik/ Blog pro kodery */ __ This email has been scanned by the MessageLabs Email Security System. For more information please visit http://www.messagelabs.com/email __
Re: Spring+Hibernate - obsluha vyjimek databaze
try{ dao.doSomething(): }catch(DataAccessExcpetion e){ } Pokud je vase DAO implementace potomkem HibernateDaoSupport musi tohle fungovat. Potom si jenom zkontrolujte jestli to opravdu vyhozuje zminenou DataIntegrityViolationException. Petr Gola napsal(a): Dekuji vsem za odpovedi. Moje predstava je takova, ze bych v business vrstve obslouzil onu vyjimku DataIntegrityViolationException a na jejim zaklade vyhodil svoji vyjimku (treba ExistingUsernameException). Ale nedari se mi zachytit DataIntegrityViolationException vyjimku v DAO implementaci (bezi to asi ve zvlastnim vlakne a na moje try-catch to nebere ohled). Kde bych mel tuto vyjimku osetrovat? Dale by me zajimalo, jestli by z teto vyjimky nebylo mozne programove zjistit nejake podrobnejsi informace - napriklad, ze se to nepodarilo ulozit skutecne diky existujicimu username, nebo kvuli necemu jinemu (napr. spatne delce hesla atd... ). S pozdravem, Petr Gola On 6/5/06, Roman Pichlik [EMAIL PROTECTED] wrote: Je potreba si prostudovat, jak funguje springovsky preklad vyjimek http://static.springframework.org/spring/docs/1.2.x/reference/dao.html#dao-exceptions Vami zminovany kod, pravdepodobne vyhodi DataIntegrityViolationException viz http://static.springframework.org/spring/docs/1.2.x/api/org/springframework/dao/DataIntegrityViolationException.html Petr Gola napsal(a): Zdravim konferenci, pracuji na 3-vrstve aplikaci (Java Swing,Spring,Hibernate,PostgreSQL). Chtel bych se zeptat zkusenejsich, jak resi obsluhu business logiky z klienta (zpetna vazba, vyjimky). Priklad: Mam v aplikaci seznam uzivatelu, pricemz kazdy uzivatel ma svoje ID (primarni klic, generovane automaticky), USERNAME (je jedinecce: unique=true) a PASSWORD. Business logika ma sluzbu UsersService a pro pridani noveho uzivatele existuje metoda addUser(String username, String password). Klient se pripoji na tuto sluzbu a pro pridani uzivatele vola prave tuto metodu. V Hibernate mam definovanou polozku username jako unique=true. Pokud se klient pokusi pridat uzivatele s jiz existujicim uzivatelsky jmenem, vyhodi hibernate vyjimku, kterou ale zatim nevim jak odchytit a zpracovat. Jak resite tento problem? Melo by to nejspis byt takhle: na pozadavek klienta se business vrstva pokusi vytvorit (getHibernateTemplate.save()) uzivatele - pokud se ji to nepodari, da o tom informaci klientovi... predstavoval jsem si to jako predani vyjimky, jenze se mi nedari odchytit jiz vyjimku Hibernate, ze se uzivatele nepodarilo vytvorit, protoze uzivatel s takovym username jiz existuje. Jak pracujete s obsluhou databaze v Spring+Hibernate vy? -- S pozdravem Roman Dagi Pichlik /* http://www.sweb.cz/pichlik/ Blog pro kodery */ __ This email has been scanned by the MessageLabs Email Security System. For more information please visit http://www.messagelabs.com/email __ -- S pozdravem Roman Dagi Pichlik /* http://www.sweb.cz/pichlik/ Blog pro kodery */ __ This email has been scanned by the MessageLabs Email Security System. For more information please visit http://www.messagelabs.com/email __
Re: Spring+Hibernate - obsluha vyjimek databaze
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(JDBCExceptionHelper.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.performExecutions 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.java:106) at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit at org.springframework.transaction.support.AbstractPlatform... at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit at org.springframework.transaction.interceptor.TransactionAspectSupport.doCommit... at org.springframework.transaction.interceptor.TransactionInterceptor.invoke 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]
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(JDBCExceptionHelper.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.performExecutions 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.java:106) at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit at org.springframework.transaction.support.AbstractPlatform... at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit at org.springframework.transaction.interceptor.TransactionAspectSupport.doCommit... at org.springframework.transaction.interceptor.TransactionInterceptor.invoke 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]
RE: Spam:Re: Spring+Hibernate - obsluha vyjimek databaze
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]