-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 
Author Message
 Post subject: All-delete-orphan Not Working. What Did I Do Wrong?
PostPosted: Thu Jul 06, 2006 11:05 pm 
Newbie

Joined: Thu Jul 06, 2006 8:38 am
Posts: 14
(All the info, version, stack trace, etc. are below)

Why is all-delete-orphan not working for my case? As I understand it from the doc

http://www.hibernate.org/hib_docs/v3/re ... transitive

Quote:
A special cascade style, delete-orphan, applies only to one-to-many associations, and indicates that the delete() operation should be applied to any child object that is removed from the association.


Also:

Quote:
If a child is dereferenced by a persistent parent, nothing special happens - the application should explicitly delete the child if necessary - unless cascade="delete-orphan", in which case the "orphaned" child is deleted.


Then why isn't it working for my case? Is it a bug? If I miss something from TFM please point me. I've done a search and reread Hibernate docs many times.

Should I do a merge() instead of saveOrUpdate()? In that case why do I get that exception below when I use merge()?

Also, if you think I'm missing a part of the TFM after all the Google search, please kindly point me to what I'm missing. Be rude if you want, just point me somewhere where I can proceed.

Thanks
Ray


Hibernate version: 3.1.3

Mapping documents:
Child.hbm.xml

<many-to-one name="parent" class="Parent" column="parent_id" not-null="true" />

Parent.hbm.xml

<set name="children" lazy="false" inverse="true" cascade="all-delete-orphan">
<key column="parent_id" not-null="true"/>
<one-to-many class="Parent"/>
</set>

Code between sessionFactory.openSession() and session.close():

// Create new empty instance of Parent
Parent parent = new Parent();
// populate empty instance with values from ActionForm
this.formToObject( parent, form );

// invoke service on the object
parent = (Parent)this.service.saveOrUpdate( parent );

Full stack trace of any exception that occurs:
If saveOrUpdate, no exception. If I change the call to merge(), I get this:

2006-07-07 10:54:50,533 ERROR [org.hibernate.LazyInitializationException] - illegal access to loading collection
org.hibernate.LazyInitializationException: illegal access to loading collection
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:341)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
at org.hibernate.collection.PersistentSet.iterator(PersistentSet.java:138)
at com.barcap.gcs.gmevents.model.security.Company.setContacts(Company.java:31)
at com.barcap.gcs.gmevents.model.Vendor$$BulkBeanByCGLIB$$c726a462.setPropertyValues(<generated>)
at org.hibernate.tuple.PojoEntityTuplizer.setPropertyValuesWithOptimizer(PojoEntityTuplizer.java:212)
at org.hibernate.tuple.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:185)
at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3232)
at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:126)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:842)
at org.hibernate.loader.Loader.doQuery(Loader.java:717)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1785)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:93)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:81)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:2730)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:365)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:346)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:123)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:177)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:889)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:826)
at org.hibernate.event.def.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:209)
at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:100)
at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:52)
at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:699)
at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:683)
at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:687)
at org.springframework.orm.hibernate3.HibernateTemplate$23.doInHibernate(HibernateTemplate.java:742)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:365)
at org.springframework.orm.hibernate3.HibernateTemplate.merge(HibernateTemplate.java:739)
at com.barcap.gcs.gmevents.dao.GenericHibernateDao.merge(GenericHibernateDao.java:84)
at com.barcap.gcs.gmevents.dao.GenericHibernateDao$$FastClassByCGLIB$$b3ce1e25.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635)

at com.barcap.gcs.gmevents.dao.GenericHibernateDao$$EnhancerByCGLIB$$355d8c04.merge(<generated>)
at com.barcap.gcs.gmevents.service.DataProcessingServiceImpl.merge(DataProcessingServiceImpl.java:103)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:335)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:
181)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:148)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:176)
at $Proxy10.merge(Unknown Source)
at com.barcap.gcs.gmevents.web.VendorAction.executeSave(VendorAction.java:98)
at com.barcap.gcs.gmevents.web.DataProcessingAction.executeSave(DataProcessingAction.java:367)
at com.barcap.gcs.gmevents.web.DataProcessingAction.internalSave(DataProcessingAction.java:294)
at com.barcap.gcs.gmevents.web.SingleModelDataProcessingAction.save(SingleModelDataProcessingAction.java:134)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
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 com.barcap.cdap.webframework.filter.RequestFilter.doFilter(RequestFilter.java:62)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.barcap.gcs.gmevents.web.GMAccessControlFilter.doFilter(GMAccessControlFilter.java:112)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.barcap.cdap.webframework.filter.LogonFilter.doFilter(LogonFilter.java:95)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.barcap.cdap.webframework.filter.AuthenticationFilter.doFilter(AuthenticationFilter.java:136)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.barcap.gcs.gmevents.web.RequestInitialisationFilter.doFilter(RequestInitialisationFilter.java:88)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.j
ava:174)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.barcap.gcs.gmevents.web.InitApplicationFilter.doFilterInternal(InitApplicationFilter.java:40)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
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(Thread.java:595)
2006-07-07 10:54:50,580 INFO [org.hibernate.event.def.DefaultLoadEventListener] - Error performing load command
org.hibernate.PropertyAccessException: exception setting property value with CGLIB (set hibernate.cglib.use_reflection_o
ptimizer=false for more info) setter of com.barcap.gcs.gmevents.model.Vendor.setContacts

Name and version of the database you are using: Oracle 9.2
















Need help with Hibernate? Read this first:
http://www.hibernate.org/ForumMailingli ... AskForHelp






The generated SQL (show_sql=true):

Debug level Hibernate log excerpt:


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jul 06, 2006 11:19 pm 
Expert
Expert

Joined: Thu Dec 23, 2004 9:08 pm
Posts: 2008
First tip: delete-orphan is usually paired with inverse="false". inverse="true" means that the parent (one-side) entity does not control the child's (many-side) lifecycle, but cascade="delete-orphan" means that it does. That's bound to get confusing.

Second point: from the stack trace, it looks like Company.setContacts() is actually doing something? Rather than just "this.contacts = param"? If it is, then that's your problem. Property accessors and mutators should not do anything except get and set the property.

_________________
Code tags are your friend. Know them and use them.


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jul 06, 2006 11:31 pm 
Newbie

Joined: Thu Jul 06, 2006 8:38 am
Posts: 14
tenwit wrote:
First tip: delete-orphan is usually paired with inverse="false". inverse="true" means that the parent (one-side) entity does not control the child's (many-side) lifecycle, but cascade="delete-orphan" means that it does. That's bound to get confusing.

Second point: from the stack trace, it looks like Company.setContacts() is actually doing something? Rather than just "this.contacts = param"? If it is, then that's your problem. Property accessors and mutators should not do anything except get and set the property.


Thanks tenwit,

I'm getting really confused now. From the document:

http://www.hibernate.org/hib_docs/refer ... child.html

It says:
Quote:
Now, in our case, a Child can't really exist without its parent. So if we remove a Child from the collection, we really do want it to be deleted. For this, we must use cascade="all-delete-orphan".

<set name="children" inverse="true" cascade="all-delete-orphan">
<key column="parent_id"/>
<one-to-many class="Child"/>
</set>


There it says the inverse="true", although the way you explain it, it does sound contradictory. So should I just remove the "setParent()" call while adding children? (Please see below about the setContacts--it calls setParent basically).


The setContacts() does something like this--it does simply assign the passed Set to the internal set, however it does extra to set the "parent" of contact properly (that's the recommended practice from the Hibernate doc I'm reading anyway):

Code:
    public void setContacts(Set<ExternalContact> p_contacts) {
        contacts = p_contacts;
        if (null == contacts) return;
       
        // Need to ensure setCompany is done for all the contacts!
        Iterator it = contacts.iterator();
        while (it.hasNext()){
            ExternalContact contact = (ExternalContact) it.next();
            contact.setCompany( this );
        }
    }


So how do you set the bidirectional (with setParent() while adding the kids), and merge() it? Does it mean that merge() and bidirectional one-to-many doesn't work well together, if at all?

Thank you,
Ray


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.