So, given your recommendation, I should do something like this:
Code:
public class RecipeListDAO extends HibernateDaoSupport {
public RecipeListDAO() {
super();
}
public void deleteRecipeItem( RecipeList recipe ) {
try {
getHibernateTemplate().delete(recipe);
}
catch( DataAccessException ex ) {
ex.printStackTrace();
if( ex.getCause() instanceof StaleObjectStateException ) {
System.out.println("WH00T! I triggered!!");
}
//do some interesting recover logic
}
}
}
If this is indeed the correct Syntax I am still not able to catch the DataAccessException or the StaleObjectStateException..
Heh... Or it could be an error that's completely unrelated to my code. I'm assuming that you can catch RuntimeExceptions the same way you catch java.lang.Exceptions, yes?
Thanks all again for your help!
Error listing and applicationContext.xml
Code:
2004-10-29 13:32:08,784 WARN StaleObjectStateException - An operation failed due to stale data
net.sf.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) for zorolrecipemgmt.hibernate.RecipeList instance with identifier: 80
at net.sf.hibernate.persister.AbstractEntityPersister.check(AbstractEntityPersister.java:506)
at net.sf.hibernate.persister.EntityPersister.delete(EntityPersister.java:596)
at net.sf.hibernate.impl.ScheduledDeletion.execute(ScheduledDeletion.java:29)
at net.sf.hibernate.impl.SessionImpl.executeAll(SessionImpl.java:2418)
at net.sf.hibernate.impl.SessionImpl.execute(SessionImpl.java:2376)
at net.sf.hibernate.impl.SessionImpl.flush(SessionImpl.java:2240)
at org.springframework.orm.hibernate.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:214)
at org.springframework.orm.hibernate.HibernateTemplate.execute(HibernateTemplate.java:201)
at org.springframework.orm.hibernate.HibernateTemplate.delete(HibernateTemplate.java:381)
at recipemgmt.hibernate.dao.RecipeListDAO.deleteRecipeItem(RecipeListDAO.java:58)
at recipemgmt.app.RecipeMgmtScreen.deleteRecipeListItem(RecipeMgmtScreen.java:398)
at recipemgmt.app.RecipeMgmtScreen.actionPerformed(RecipeMgmtScreen.java:189)
at nextapp.echo.AbstractButton.fireActionPerformed(AbstractButton.java:268)
at nextapp.echo.AbstractButton$EventForwarder.actionPerformed(AbstractButton.java:127)
at nextapp.echo.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:88)
at nextapp.echo.DefaultButtonModel.doAction(DefaultButtonModel.java:77)
at nextapp.echo.AbstractButton.doAction(AbstractButton.java:238)
at nextapp.echoservlet.ui.AbstractButtonUI.clientAction(AbstractButtonUI.java:76)
at echopoint.ui.PushButtonUI.clientAction(PushButtonUI.java:85)
at nextapp.echoservlet.ControllerInputProcessor.doAction(ControllerInputProcessor.java:144)
at nextapp.echoservlet.ControllerInputProcessor.<init>(ControllerInputProcessor.java:113)
at nextapp.echoservlet.ControllerInputProcessor.process(ControllerInputProcessor.java:44)
at nextapp.echoservlet.Controller.service(Controller.java:604)
at nextapp.echoservlet.Connection.process(Connection.java:441)
at nextapp.echoservlet.EchoServer.process(EchoServer.java:303)
at nextapp.echoservlet.EchoServer.doPost(EchoServer.java:223)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:793)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:702)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:571)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:644)
at java.lang.Thread.run(Thread.java:536)
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"><value>org.postgresql.Driver</value></property>
<property name="url"><value>jdbc:postgresql://localhost/recipe</value></property>
<property name="username"><value></value></property>
<property name="password"><value></value></property>
</bean>
<bean id="tomcatSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"><value>org.postgresql.Driver</value></property>
<property name="url"><value>jdbc:postgresql://localhost/tomcatusers</value></property>
<property name="username"><value></value></property>
<property name="password"><value></value></property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource"><ref local="dataSource"/></property>
<property name="mappingResources">
<list>
<value>zorolrecipemgmt/hibernate/RecipeList.hbm</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.cglib.use_reflection_optimizer">false</prop>
<prop key="hibernate.dialect">net.sf.hibernate.dialect.PostgreSQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="recipeListDAO" class="recipemgmt.hibernate.dao.RecipeListDAO">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
<bean id="recipeListFactory" class="zorolrecipemgmt.beans.RecipeListFactory">
<property name="recipeListDAO">
<ref bean="recipeListDAO"/>
</property>
</bean>
</beans>