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