1

I have parent object(DDetails) , which consists 7 child objects(DPricingElements, DCoverages, DElectricalLimit, DVehicleDetails, DAttributes, DNonElecLimit, DPartyDetails), i am deleting the parent object that will delete the child objects too. Using below code,

Query query = session.createQuery("FROM DDetails where DQuote.Id =:Id").setParameter("Id", Id);
List<DDetails> quertList = query.list();
session.delete(dDetails);

Its deleting child and parent too, some rare scenario i got an exception org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [com.model.DDetails#257309]

I am wondering about cascade associations but above code running more than 2 years on production. There not able to produce the same exception and exception got an Test, UAT enviornments.

Please find the log trace;

Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: deleted object would be re-saved by cascade (remove deleted object from associations): [com.model.DDetails#257309]; nested exception is org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [com.model.DDetails#257309]
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:674)
    at org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:793)
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:664)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at com.sun.proxy.$Proxy70.updateVehicleDetails(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:180)
    at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
    ... 38 more
Caused by: org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [com.model.DDetails#257309]
    at org.hibernate.impl.SessionImpl.forceFlush(SessionImpl.java:1230)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:188)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
    at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685)
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677)
    at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:252)
    at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
    at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:425)
    at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:362)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:338)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
    at org.hibernate.engine.Cascade.cascade(Cascade.java:161)
    at org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:154)
    at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:145)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:88)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656)
    ... 51 more

Please find the DDetails.hbm.xml

<set name="DPricingElementses" table="D_PRICING_ELEMENTS"
            inverse="true" lazy="false" fetch="select" cascade="all-delete-orphan">
            <key>
                <column name="_ID" precision="10" scale="0" />
            </key>
            <one-to-many class="com.model.DPricingElements" />
        </set>

        <set name="DCoverageses" table="D_COVERAGES" inverse="true"
            lazy="false" fetch="select" cascade="all-delete-orphan">
            <key>
                <column name="_ID" precision="15" scale="0" />
            </key>
            <one-to-many class="com.model.DCoverages" />
        </set>
        <set name="DElectricalLimits" table="D_ELECTRICAL_LIMIT"
            inverse="true" lazy="false" fetch="select" cascade="all-delete-orphan">
            <key>
                <column name="_ID" precision="10" scale="0" />
            </key>
            <one-to-many class="com.model.DElectricalLimit" />
        </set>
        <set name="DVehicleDetailses" table="D_VEHICLE_DETAILS"
            inverse="true" lazy="false" fetch="select" cascade="all-delete-orphan">
            <key>
                <column name="_ID" precision="10" scale="0" />
            </key>
            <one-to-many class="com.model.DVehicleDetails" />
        </set>
        <set name="DAttributeses" table="D_ATTRIBUTES"
            inverse="true" lazy="false" fetch="select" cascade="all-delete-orphan">
            <key>
                <column name="_ID" precision="10" scale="0" />
            </key>
            <one-to-many class="com.model.DAttributes" />
        </set>
        <set name="DNonElecLimits" table="D_NON_ELEC_LIMIT"
            inverse="true" lazy="false" fetch="select" cascade="all-delete-orphan">
            <key>
                <column name="_ID" precision="10" scale="0" />
            </key>
            <one-to-many class="com.model.DNonElecLimit" />
        </set>
        <set name="DPartyDetailses" table="D_PARTY_DETAILS"
            inverse="true" lazy="false" fetch="select" cascade="all-delete-orphan">
            <key>
                <column name="_ID" precision="22" scale="0" not-null="true" />
            </key>
            <one-to-many class="com.model.DPartyDetails" />
        </set>

With the help of org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): and I changed code too belo but still same exception got.

for (DDetails dDetails: quertList) {
 if (dDetails.getDNonElecLimits() != null && !dDetails.getDNonElecLimits().isEmpty()) {
  for (DNonElecLimit a: new ArrayList < DNonElecLimit > (dDetails.getDNonElecLimits())) {
   dDetails.getDNonElecLimits().remove(a);
   //session.delete(a); 
  }
 }

 if (dDetails.getDElectricalLimits() != null && !dDetails.getDElectricalLimits().isEmpty()) {
  for (DElectricalLimit b: new ArrayList < DElectricalLimit > (dDetails.getDElectricalLimits())) {
   dDetails.getDElectricalLimits().remove(b);
   //session.delete(b); 
  }
 }

 if (dDetails.getDAttributeses() != null && !dDetails.getDAttributeses().isEmpty()) {
  for (DAttributes c: new ArrayList < DAttributes > (dDetails.getDAttributeses())) {
   dDetails.getDAttributeses().remove(c);
  }
 }

 if (dDetails.getDCoverageses() != null && !dDetails.getDCoverageses().isEmpty()) {
  for (DCoverages d: new ArrayList < DCoverages > (dDetails.getDCoverageses())) {
   dDetails.getDCoverageses().remove(d);
  }
 }

 if (dDetails.getDPricingElementses() != null && !dDetails.getDPricingElementses().isEmpty()) {
  for (DPricingElements e: new ArrayList < DPricingElements > (dDetails.getDPricingElementses())) {
   dDetails.getDPricingElementses().remove(e);
  }

 }

 if (dDetails.getDVehicleDetailses() != null && !dDetails.getDVehicleDetailses().isEmpty()) {
  for (DVehicleDetails f: new ArrayList < DVehicleDetails > (dDetails.getDVehicleDetailses())) {
   dDetails.getDVehicleDetailses().remove(f);
  }

 }

 if (dDetails.getDThirdPartyDetailses() != null && !dDetails.getDThirdPartyDetailses().isEmpty()) {
  for (DThirdPartyDetails g: new ArrayList < DThirdPartyDetails > (dDetails.getDThirdPartyDetailses())) {
   dDetails.getDThirdPartyDetailses().remove(g);
  }
 }

 session.delete(dDetails);
 session.flush();
}
Vlad Mihalcea
  • 142,745
  • 71
  • 566
  • 911
pandiaraj
  • 580
  • 1
  • 6
  • 18
  • Possible duplicate of [org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations):](https://stackoverflow.com/questions/18358407/org-hibernate-objectdeletedexception-deleted-object-would-be-re-saved-by-cascad) – Calvin Taylor Nov 09 '17 at 07:27
  • Hi Calvin, i have removed collection from parent with help of above mentioned link. Still issue pursuits. – pandiaraj Nov 09 '17 at 09:32
  • Hi, I think it's one of the objects, parent or children are members of some existing collection. I would highly recommend reviewing your code to see what the objects are being added to. Your IDE should be able to point to each use. Ensure they are removed or the collection is destroyed. I would also recommend having a test case to show how this manifested before committing any fix as your code review or qa will (should) throw a fit. – Calvin Taylor Nov 09 '17 at 09:48
  • how do you know its still an issue if you can't replicate it? – Calvin Taylor Nov 09 '17 at 09:54
  • I changed code to removing all reference from collections and deleting parent object. Same exception got so conveyed still issue pursuits. – pandiaraj Nov 09 '17 at 10:20
  • perhaps you could clarify this line in your question then, "There not able to produce the same exception and exception got an Test, UAT enviornments." – Calvin Taylor Nov 09 '17 at 10:47
  • Sorry, i can able to replicate same issue on staging and production also. My indentation to delete the child records as well as parent record. But i am wondering about session.delete(Ddetails) working more than two years, now some scenario not working. There is no code changes made on that method level. – pandiaraj Nov 09 '17 at 11:17

1 Answers1

0

Its deleting child and parent too, some rare scenario i got an exception org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [com.model.DDetails#257309]

That's because, sometimes, you have a Parent entity holding back a reference to DDetailswith cascade, and, you didn't clear that reference.

Meanwhile, an easy fix would be to do something like this:

session.clear();

session.createQuery("delete from DDetails where DQuote.Id =:Id")
.setParameter("Id", Id)
.executeUpdate();

That will surely delete it.

Vlad Mihalcea
  • 142,745
  • 71
  • 566
  • 911