You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@openjpa.apache.org by Andy Schlaikjer <ha...@cs.cmu.edu> on 2008/01/11 01:37:10 UTC
stack overflow on persist of large object graph via cascade
Hi,
I'm running Linux, Sun JDK 1.6.0_01-b06, and OpenJPA 1.0.1. When
attempting to persist a relatively large object graph (though size in
data isn't horribly large) via cascade, I'm running into this exception:
Exception in thread "main" java.lang.StackOverflowError
at java.security.AccessController.doPrivileged(Native Method)
at
org.apache.openjpa.enhance.Reflection.getDeclaredField(Reflection.java:166)
at
org.apache.openjpa.enhance.Reflection.findField(Reflection.java:145)
at
org.apache.openjpa.enhance.edu$cmu$albatross$dblp$Field$pcsubclass.pcProvideField(Unknown
Source)
at
org.apache.openjpa.kernel.StateManagerImpl.provideField(StateManagerImpl.java:2959)
at
org.apache.openjpa.kernel.StateManagerImpl.fetchObjectField(StateManagerImpl.java:2201)
at
org.apache.openjpa.kernel.StateManagerImpl.fetchField(StateManagerImpl.java:759)
at
org.apache.openjpa.kernel.StateManagerImpl.fetch(StateManagerImpl.java:721)
at
org.apache.openjpa.kernel.StateManagerImpl.dirtyCheck(StateManagerImpl.java:807)
at
org.apache.openjpa.kernel.BrokerImpl$ManagedCache.dirtyCheck(BrokerImpl.java:4620)
at
org.apache.openjpa.kernel.BrokerImpl$ManagedCache.access$000(BrokerImpl.java:4360)
at
org.apache.openjpa.kernel.BrokerImpl.hasTransactionalObjects(BrokerImpl.java:3739)
at
org.apache.openjpa.kernel.BrokerImpl.setDirty(BrokerImpl.java:3856)
at
org.apache.openjpa.kernel.StateManagerImpl.setPCState(StateManagerImpl.java:207)
at
org.apache.openjpa.kernel.StateManagerImpl.dirty(StateManagerImpl.java:1532)
at
org.apache.openjpa.kernel.StateManagerImpl.dirty(StateManagerImpl.java:1471)
at
org.apache.openjpa.kernel.StateManagerImpl.dirtyCheck(StateManagerImpl.java:808)
at
org.apache.openjpa.kernel.BrokerImpl$ManagedCache.dirtyCheck(BrokerImpl.java:4620)
at
org.apache.openjpa.kernel.BrokerImpl$ManagedCache.access$000(BrokerImpl.java:4360)
at
org.apache.openjpa.kernel.BrokerImpl.hasTransactionalObjects(BrokerImpl.java:3739)
...
Afterwards, the trace repeats these lines over and over:
at
org.apache.openjpa.kernel.BrokerImpl.setDirty(BrokerImpl.java:3856)
at
org.apache.openjpa.kernel.StateManagerImpl.setPCState(StateManagerImpl.java:207)
at
org.apache.openjpa.kernel.StateManagerImpl.dirty(StateManagerImpl.java:1532)
at
org.apache.openjpa.kernel.StateManagerImpl.dirty(StateManagerImpl.java:1471)
at
org.apache.openjpa.kernel.StateManagerImpl.dirtyCheck(StateManagerImpl.java:808)
at
org.apache.openjpa.kernel.BrokerImpl$ManagedCache.dirtyCheck(BrokerImpl.java:4620)
at
org.apache.openjpa.kernel.BrokerImpl$ManagedCache.access$000(BrokerImpl.java:4360)
at
org.apache.openjpa.kernel.BrokerImpl.hasTransactionalObjects(BrokerImpl.java:3739)
at
org.apache.openjpa.kernel.BrokerImpl.setDirty(BrokerImpl.java:3856)
Could anyone help explain what the cause might be, or how I might avoid
this type of error? I guess I'd need to somehow determine a reasonable
bound on number of objects to attempt to persist in a single transaction
and then divvy up my object graph to accommodate this.
Thanks,
Andy
Re: stack overflow on persist of large object graph via cascade
Posted by Andy Schlaikjer <ha...@cs.cmu.edu>.
I've gotten around this error by reconfiguring a few of my bidirectional
relations (the cascade options), adding more explicit calls to
EntityManager.persist instead of relying on cascade behavior, and
aggressively detaching newly persisted objects during batch loading via
EntityManager.clear.
Andy
Andy Schlaikjer wrote:
> Hi,
>
> I'm running Linux, Sun JDK 1.6.0_01-b06, and OpenJPA 1.0.1. When
> attempting to persist a relatively large object graph (though size in
> data isn't horribly large) via cascade, I'm running into this exception:
>
> Exception in thread "main" java.lang.StackOverflowError
> at java.security.AccessController.doPrivileged(Native Method)
> at
> org.apache.openjpa.enhance.Reflection.getDeclaredField(Reflection.java:166)
> at
> org.apache.openjpa.enhance.Reflection.findField(Reflection.java:145)
> at
> org.apache.openjpa.enhance.edu$cmu$albatross$dblp$Field$pcsubclass.pcProvideField(Unknown
> Source)
> at
> org.apache.openjpa.kernel.StateManagerImpl.provideField(StateManagerImpl.java:2959)
>
> at
> org.apache.openjpa.kernel.StateManagerImpl.fetchObjectField(StateManagerImpl.java:2201)
>
> at
> org.apache.openjpa.kernel.StateManagerImpl.fetchField(StateManagerImpl.java:759)
>
> at
> org.apache.openjpa.kernel.StateManagerImpl.fetch(StateManagerImpl.java:721)
> at
> org.apache.openjpa.kernel.StateManagerImpl.dirtyCheck(StateManagerImpl.java:807)
>
> at
> org.apache.openjpa.kernel.BrokerImpl$ManagedCache.dirtyCheck(BrokerImpl.java:4620)
>
> at
> org.apache.openjpa.kernel.BrokerImpl$ManagedCache.access$000(BrokerImpl.java:4360)
>
> at
> org.apache.openjpa.kernel.BrokerImpl.hasTransactionalObjects(BrokerImpl.java:3739)
>
> at
> org.apache.openjpa.kernel.BrokerImpl.setDirty(BrokerImpl.java:3856)
> at
> org.apache.openjpa.kernel.StateManagerImpl.setPCState(StateManagerImpl.java:207)
>
> at
> org.apache.openjpa.kernel.StateManagerImpl.dirty(StateManagerImpl.java:1532)
>
> at
> org.apache.openjpa.kernel.StateManagerImpl.dirty(StateManagerImpl.java:1471)
>
> at
> org.apache.openjpa.kernel.StateManagerImpl.dirtyCheck(StateManagerImpl.java:808)
>
> at
> org.apache.openjpa.kernel.BrokerImpl$ManagedCache.dirtyCheck(BrokerImpl.java:4620)
>
> at
> org.apache.openjpa.kernel.BrokerImpl$ManagedCache.access$000(BrokerImpl.java:4360)
>
> at
> org.apache.openjpa.kernel.BrokerImpl.hasTransactionalObjects(BrokerImpl.java:3739)
>
> ...
>
> Afterwards, the trace repeats these lines over and over:
>
> at
> org.apache.openjpa.kernel.BrokerImpl.setDirty(BrokerImpl.java:3856)
> at
> org.apache.openjpa.kernel.StateManagerImpl.setPCState(StateManagerImpl.java:207)
>
> at
> org.apache.openjpa.kernel.StateManagerImpl.dirty(StateManagerImpl.java:1532)
>
> at
> org.apache.openjpa.kernel.StateManagerImpl.dirty(StateManagerImpl.java:1471)
>
> at
> org.apache.openjpa.kernel.StateManagerImpl.dirtyCheck(StateManagerImpl.java:808)
>
> at
> org.apache.openjpa.kernel.BrokerImpl$ManagedCache.dirtyCheck(BrokerImpl.java:4620)
>
> at
> org.apache.openjpa.kernel.BrokerImpl$ManagedCache.access$000(BrokerImpl.java:4360)
>
> at
> org.apache.openjpa.kernel.BrokerImpl.hasTransactionalObjects(BrokerImpl.java:3739)
>
> at
> org.apache.openjpa.kernel.BrokerImpl.setDirty(BrokerImpl.java:3856)
>
> Could anyone help explain what the cause might be, or how I might avoid
> this type of error? I guess I'd need to somehow determine a reasonable
> bound on number of objects to attempt to persist in a single transaction
> and then divvy up my object graph to accommodate this.
>
> Thanks,
> Andy
>