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

Odpovedet emailem