Hi all,
I have a self-referenced table called Category. the relationship is such that a Category can have 0 or more sub-categories, therefore a Category may or may NOT have a Parent Category.
The following is the hbm mapping file for the Category class.
Basically when I create (insert) an entry both with a parent and without a parent the record gets inserted successfully. But when I'm trying to update parent of an existing Category, Hibernate throws the enclosed exception.
Hope you'll be able to help me. And yes, I'm using Hibernate with Spring but the problem is nothing related to spring (I think so).
Many Thanks
Nitin.
Info Included:
============================================
Hibernate version: 3
Mapping documents:
<hibernate-mapping
>
<class
name="com.eCafe.valueobjects.Category"
table="ECAFE_CATEGORY"
>
<id
name="id"
column="CATEGORY_ID"
type="java.lang.String"
>
<generator class="uuid.hex">
</generator>
</id>
<many-to-one
name="parent"
class="com.eCafe.valueobjects.Category"
cascade="save-update"
outer-join="auto"
update="true"
insert="true"
column="parent"
not-null="false"
/>
<property
name="desc"
type="java.lang.String"
update="true"
insert="true"
column="CATEGORY_DESCRIPTION"
/>
<property
name="name"
type="java.lang.String"
update="true"
insert="true"
column="CATEGORY_NAME"
not-null="true"
unique="true"
/>
<property
name="parentId"
type="java.lang.String"
update="true"
insert="true"
column="CATEGORY_PARENTID"
not-null="false"
/>
</class>
</hibernate-mapping>
I'm using Spring with Hibernate to do the operations.
Code between sessionFactory.openSession() and session.close():
Category parent = null;
// IF PARENT IS SELECTED BY THE USER THEN LOAD THE PARENT OBJECT
if(category.getParent() != null && category.getParent().getId() != null && category.getParent().getId().trim().length() > 0)
{
parent = (Category) getHibernateTemplate().load(Category.class, category.getParent().getId());
}
category.setParent(parent);
getHibernateTemplate().update(category);
Full stack trace of any exception that occurs:
org.hibernate.HibernateException: identifier of an instance of com.eCafe.valueobjects.Category was altered from 4028818208fc88d50108fc8b607d0002 to 4028818208fc88d50108fc8c55e
at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:51)
at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:140)
at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:97)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:195)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:908)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:344)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:584)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:496)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:469)
at org.springframework.transaction.interceptor.TransactionAspectSupport.doCommitTransactionAfterReturning(TransactionAspectSupport.java:266)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:176)
at $Proxy4.updateCategory(Unknown Source)
at com.eCafe.controllers.CategoryController.onSubmit(CategoryController.java:80)
at org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:258)
at org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:259)
at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:139)
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:44)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:717)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:658)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:392)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:357)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:868)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:663)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)
Name and version of the database you are using: MySQL 4.1
|