RE: Spam:Re: Spring+Hibernate - obsluha vyjimek databaze

2006-06-06 Tema obsahu Rastislav Siekel
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

2006-06-06 Tema obsahu Roman Pichlik



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

2006-06-06 Tema obsahu Jiří Melichna

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

2006-06-06 Tema obsahu Kamil Podlesak

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

2006-06-06 Tema obsahu Petr Gola

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

2006-06-06 Tema obsahu Petr Gola

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

2006-06-05 Tema obsahu Roman Pichlik

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

2006-06-05 Tema obsahu Petr Gola

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

2006-06-05 Tema obsahu Roman Pichlik

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

2006-06-05 Tema obsahu Kamil Podlesak

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

2006-06-05 Tema obsahu Petr Gola

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

2006-06-05 Tema obsahu Michal Palička

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

2006-06-04 Tema obsahu Petr Gola

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?