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]