RE: Spam:Re: Spring+Hibernate - obsluha vyjimek databaze
Petr, Michalove riešenie je naozaj jediné možné, pretože aj keby si sa dostal na konkrétnu chybovú hlášku konkrétnej databázy (neviem, či to ide) - SQLException.getErrorCode(), chyba podľa toho kódu tam bude znieť nejako Constraint ABCD violated a keby si chcel zistiť ktorá to bola tabuľka a ktorý stĺpec, musel by si začať prehľadávať tabuľky SYSTABLE, SYSCONSTRAINT, SYSCOLUMN, ..., čo by bolo dosť veľa roboty navyše. Ďalej by si musel urobiť mapovanie - podľa názvu tabuľky a stĺpca vrátiť zmysluplnú chybovú hlášku. Samozrejme, ako písal Michal - tento aparát by sa musel prepísať pri prípadnej zmene databázy. Jedným slovom - vtákovina ;-) Rastislav Bedo Siekel -Original Message- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Petr Gola Sent: 5. júna 2006 22:53 To: Java Subject: Re: Spam:Re: Spring+Hibernate - obsluha vyjimek databaze No, pokud bych zavedl do aplikace i validaci vstupnich dat, tak bych musel pri pridavani kazdeho dalsiho zaznamu precist vsechny zaznamy v databazi a zkontrolovat, jestli uz tam nejaky zaznam se stejnym username neexistuje. Hm, asi je to jedina moznost - ale stejne me porad vrta hlavou, jestli se to neresi jinak... :) S pozdravem, Petr Gola On 6/5/06, Michal Palička [EMAIL PROTECTED] wrote: 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(SQLStateConverte r. java:71) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionH el per.java:43) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.ja va :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
Re: Spam:Re: Spring+Hibernate - obsluha vyjimek databaze
No, pokud bych zavedl do aplikace i validaci vstupnich dat, tak bych musel pri pridavani kazdeho dalsiho zaznamu precist vsechny zaznamy v databazi a zkontrolovat, jestli uz tam nejaky zaznam se stejnym username neexistuje. Hm, asi je to jedina moznost - ale stejne me porad vrta hlavou, jestli se to neresi jinak... :) proc by jste prenacital vsechnyy data? Staci si do toho DAO objektu dodelat jednu metodu (a samzorejme patricny HQL dotaz), ktera bude hledat dany zaznam podle username. String userName = user.getUserName; if(dao.findByUserName(userName) == null) { dao.save(user); }else { throw new RuntimeException(sorry username + userName + already exists); } Diky anotacim (k oznaceni primarniho klice) a AOP si muzete napsat aspekt, ktery bude umet zkontrolovat kazdy takovy objekt pred uloznenim. Vyhoda aspektu pak bude v tom, ze jej nebudete mit zadratovany primo v kodu kazdeho DAO objektu, ale jenom na urovni Springu. -- 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: Spam:Re: Spring+Hibernate - obsluha vyjimek databaze
Preji vsem hezky den, koukam, ze zpusob vlozeni zaznamu do RDBMS je tak trochu filozoficka uvaha a vidim, ze jsou dva az tri tabory: - tabor 1 (dle meho nazoru hazarderi): Vlozit naslepo a cekat na pripadnou vyjimku - tabor 2 (realiste): Provest kontrolu (validaci dat) a pak vlozit (s ocekacekavanim pripadne vyjimky v napr v pripade nasazeni v clusteru) - mimochodem se ve vasem pripade urcite neprochazi vse, ale velmi selektivne dle unikatniho klice, ktery bude podporen indexem - tabor 3 (nejvetsi pesimiste): Zamknout tabulku na urovni DB, provest kontrolu a vlozit - napr. vyuziti API s ulozenymi procedurami Jsem zvedav, ktery tabor zvitezi... Ja osobne jsem spise realista az pesimista. Co se tyce business vyjimek napr. na existenci uzivatele, urcite bych provedl nejprve validaci na urovni provedeni dotazu do RDBMS - jiz DAO by generovalo svou exception - obesel bych nutnost deklarovat transakci na DAO, mel bych spravnou abstrakci vyjimky na vsech urovnich, byla by poskytnuta vhodna vyjimka pro rollback v transakcnim manazeru, ze SQL kodu chyby bych slozite nelouskal problem s constraintem a nemusel toto resit pro vice ruznych DB. Konec koncu ona DataIntegrityViolationException je hodne obecna a Spring ji vraci na kde co a tak se podle meho nehodi pro vyse zmineny postup. Mimochodem exception je napr. v RDBMS Oracle pomerne draha operace - vetsinou narocnejsi nez overeni existence zaznamu dle unikatniho klice. melichnj Původní zpráva Od: Petr Gola [EMAIL PROTECTED] Předmět: Re: Spam:Re: Spring+Hibernate - obsluha vyjimek databaze Datum: 05.6.2006 22:53:15 No, pokud bych zavedl do aplikace i validaci vstupnich dat, tak bych musel pri pridavani kazdeho dalsiho zaznamu precist vsechny zaznamy v databazi a zkontrolovat, jestli uz tam nejaky zaznam se stejnym username neexistuje. Hm, asi je to jedina moznost - ale stejne me porad vrta hlavou, jestli se to neresi jinak... :) S pozdravem, Petr Gola On 6/5/06, Michal Palička [EMAIL PROTECTED] wrote: 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
Re: Spring+Hibernate - obsluha vyjimek databaze
Petr Gola wrote: Mockrat dekuji. Mam jeste jeden dotaz. Pokud obsahuje zaznam vice unique polozek - jsem schopen z vyjimky nejak zjistit, ktera constraint je duvodem? Pripadne jak? Ne. Každá databáze tento problém oznamuje jinak, některé dokonce vůbec v chybové hlášce neuvádí o jaký sloupec se jedná. 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? Lepší bude předem si zjistit, zda uživatel existuje nebo ne. -- Kamil Podlesak [EMAIL PROTECTED]
Re: Spring+Hibernate - obsluha vyjimek databaze
Ano, nakonec jsem to tak preci udelal:) Pred vkladanim hledam uzivatele se stejnym username. Nakonec se mi to takhle libi nejvic, zatim bezim pod PostgreSQL, ale mozna to neni definitivni DB. Ale docela me zaujala moznost napsat si na to aspekt... jak zminoval Roman Pichlik. On 6/6/06, Kamil Podlesak [EMAIL PROTECTED] wrote: Petr Gola wrote: Mockrat dekuji. Mam jeste jeden dotaz. Pokud obsahuje zaznam vice unique polozek - jsem schopen z vyjimky nejak zjistit, ktera constraint je duvodem? Pripadne jak? Ne. Každá databáze tento problém oznamuje jinak, některé dokonce vůbec v chybové hlášce neuvádí o jaký sloupec se jedná. 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? Lepší bude předem si zjistit, zda uživatel existuje nebo ne. -- Kamil Podlesak [EMAIL PROTECTED]
Re: Spam:Re: Spring+Hibernate - obsluha vyjimek databaze
Tak po dnesni noci jsem realista:) Ale zaujala me docela moznost napsat si na to aspekt. Na to se jeste podivam:) S pozdravem, Petr Gola On 6/6/06, Jiří Melichna [EMAIL PROTECTED] wrote: Preji vsem hezky den, koukam, ze zpusob vlozeni zaznamu do RDBMS je tak trochu filozoficka uvaha a vidim, ze jsou dva az tri tabory: - tabor 1 (dle meho nazoru hazarderi): Vlozit naslepo a cekat na pripadnou vyjimku - tabor 2 (realiste): Provest kontrolu (validaci dat) a pak vlozit (s ocekacekavanim pripadne vyjimky v napr v pripade nasazeni v clusteru) - mimochodem se ve vasem pripade urcite neprochazi vse, ale velmi selektivne dle unikatniho klice, ktery bude podporen indexem - tabor 3 (nejvetsi pesimiste): Zamknout tabulku na urovni DB, provest kontrolu a vlozit - napr. vyuziti API s ulozenymi procedurami Jsem zvedav, ktery tabor zvitezi... Ja osobne jsem spise realista az pesimista. Co se tyce business vyjimek napr. na existenci uzivatele, urcite bych provedl nejprve validaci na urovni provedeni dotazu do RDBMS - jiz DAO by generovalo svou exception - obesel bych nutnost deklarovat transakci na DAO, mel bych spravnou abstrakci vyjimky na vsech urovnich, byla by poskytnuta vhodna vyjimka pro rollback v transakcnim manazeru, ze SQL kodu chyby bych slozite nelouskal problem s constraintem a nemusel toto resit pro vice ruznych DB. Konec koncu ona DataIntegrityViolationException je hodne obecna a Spring ji vraci na kde co a tak se podle meho nehodi pro vyse zmineny postup. Mimochodem exception je napr. v RDBMS Oracle pomerne draha operace - vetsinou narocnejsi nez overeni existence zaznamu dle unikatniho klice. melichnj Původní zpráva Od: Petr Gola [EMAIL PROTECTED] Předmět: Re: Spam:Re: Spring+Hibernate - obsluha vyjimek databaze Datum: 05.6.2006 22:53:15 No, pokud bych zavedl do aplikace i validaci vstupnich dat, tak bych musel pri pridavani kazdeho dalsiho zaznamu precist vsechny zaznamy v databazi a zkontrolovat, jestli uz tam nejaky zaznam se stejnym username neexistuje. Hm, asi je to jedina moznost - ale stejne me porad vrta hlavou, jestli se to neresi jinak... :) S pozdravem, Petr Gola On 6/5/06, Michal Palička [EMAIL PROTECTED] wrote: 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
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]
Spring+Hibernate - obsluha vyjimek databaze
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?