Hibernate version: 3.1.x
Code between sessionFactory.openSession() and session.close():
I use OpenSessionInViewFilter
Full stack trace of any exception that occurs:
Code:
org.springframework.orm.hibernate3.HibernateSystemException: this instance does not yet exist as a row in the database; nested exception is org.hibernate.HibernateException: this instance does not yet exist as a row in the database
Caused by:
org.hibernate.HibernateException: this instance does not yet exist as a row in the database
at org.hibernate.event.def.DefaultRefreshEventListener.onRefresh(DefaultRefreshEventListener.java:90)
at org.hibernate.event.def.DefaultRefreshEventListener.onRefresh(DefaultRefreshEventListener.java:39)
at org.hibernate.impl.SessionImpl.fireRefresh(SessionImpl.java:886)
at org.hibernate.impl.SessionImpl.refresh(SessionImpl.java:870)
at org.springframework.orm.hibernate3.HibernateTemplate$7.doInHibernate(HibernateTemplate.java:563)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372)
at org.springframework.orm.hibernate3.HibernateTemplate.refresh(HibernateTemplate.java:557)
at org.springframework.orm.hibernate3.HibernateTemplate.refresh(HibernateTemplate.java:553)
at xxx.common.data.CommonDAO.save(CommonDAO.java:85)
at xxx.dao.agreement.AgreementDAO.save(AgreementDAO.java:192)
at xxx.business.agreement.AgreementManagerImpl.save(AgreementManagerImpl.java:262)
at xxx.business.agreement.AgreementManagerImpl$$FastClassByCGLIB$$e37e2c62.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:695)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:630)
at xxx.business.agreement.AgreementManagerImpl$$EnhancerByCGLIB$$708c663e.save(<generated>)
at xxx.web.agreement.NewAgreementController.onSubmitInternal(NewAgreementController.java:73)
at xxx.web.EDAPBaseSimpleFormController.onSubmit(EDAPBaseSimpleFormController.java:32)
Name and version of the database you are using: Oracle 9i
I wrote an event listener for updating common fields like createdBy, updatedDate etc on all the Domain Objects
Code:
public class UpdateUserDateListener implements PreInsertEventListener, PreUpdateEventListener {
private static final Logger log = Logger.getLogger(UpdateUserDateListener.class);
public boolean onPreInsert(PreInsertEvent event) {
Object obj = event.getEntity();
boolean modified = false;
if (obj instanceof IdObject) {
log.debug("updating createUser, createDate, updateUser, updateDate");
IdObject entity = (IdObject)obj;
entity.setCreateUser(SecurityThreadLocal.get());
entity.setCreateDate(Calendar.getInstance().getTime());
entity.setUpdateUser(SecurityThreadLocal.get());
entity.setUpdateDate(Calendar.getInstance().getTime());
modified = true;
}
return modified;
}
public boolean onPreUpdate(PreUpdateEvent event) {
Object obj = event.getEntity();
boolean modified = false;
if (obj instanceof IdObject) {
log.debug("updating updateUser, updateDate");
IdObject entity = (IdObject)obj;
entity.setUpdateUser(SecurityThreadLocal.get());
entity.setUpdateDate(Calendar.getInstance().getTime());
modified=true;
}
return modified;
}
}
The code for my CommonDao.save() is
Code:
public void save(Object transientInstance) {
log.debug("saving Object instance:"+transientInstance);
try {
getHibernateTemplate().saveOrUpdate(transientInstance);
getHibernateTemplate().flush();
getHibernateTemplate().refresh(transientInstance);
log.debug("save successful:"+transientInstance);
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
I added the inteceptors in localSessionFactory of Spring app Context
Code:
<property name="eventListeners">
<map>
<entry key="merge">
<bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" />
</entry>
<entry key="pre-insert">
<bean class="xxx.UpdateUserDateListener" />
</entry>
<entry key="pre-update">
<bean class="xxx.UpdateUserDateListener" />
</entry>
</map>
</property>
I can see in debug mode that, it does invoke the event handler just when I call a SomeDao.save() in my controller class. However it throws an exception after .refresh()
Any help to debug this, appreciated!