> -----Original Message-----
> From: KARR, DAVID (ATTCINW)
> Sent: Monday, December 14, 2009 12:45 PM
> To: [email protected]
> Subject: NPE loading fields of one-to-many collection
> 
> Using OpenJPA 1.2.1, presently with neither load-time or build-time
> enhancement, for different reasons.  I have a ticket open for my
> build-time enhancement issues.  It could be that since OpenJPA doesn't
> support running without enhancement, I won't be able to make any
> significant progress on this until my issues with build-time
> enhancement
> are resolved.
> 
> I have mapped two simple classes, and I'm now trying to test the
> mappings.  Each class has one relationship attribute.  The first one
> relates to the second one, and the second one has a recursive
> relationship.  Each one of these relationships is done with a join
> table.  I believe I've specified the correct annotations and orm.xml
> settings to do this mapping.  I tried running the generated SQL I saw
> for the relationship, and it appears to give me a reasonable result.
> 
> I think the first relationship is working fine, but the second one is
> giving me trouble.  When I run a request where the second relationship
> ends up being empty, it works fine.  If it's not empty, I see the
> following unhelpful message:
> 
>   WARNING: WebApplicationException has been caught : cause is
> java.lang.NullPointerException
> 
> There is no stack trace.  So, I set Eclipse to stop on NPE and I found
> it stopping at the following place:
> 
> 
>
com$att$ecom$dynamiccontent$domain$Category$pcsubclass.pcReplaceField(i
> n
> t) line: not available
>       StateManagerImpl.replaceField(PersistenceCapable, FieldManager,
> int) line: 3025
>       StateManagerImpl.storeObjectField(int, Object) line: 2457
>       StateManagerImpl.storeObject(int, Object) line: 2447
> 
>
RelationCollectionTableFieldStrategy(StoreCollectionFieldStrategy).load
> (
> OpenJPAStateManager, JDBCStore, JDBCFetchConfiguration) line: 569
>       FieldMapping.load(OpenJPAStateManager, JDBCStore,
> JDBCFetchConfiguration) line: 819
>       JDBCStoreManager.load(OpenJPAStateManager, BitSet,
> FetchConfiguration, int, Object) line: 688
> 
> ROPStoreManager(DelegatingStoreManager).load(OpenJPAStateManager,
> BitSet, FetchConfiguration, int, Object) line: 116
>       ROPStoreManager.load(OpenJPAStateManager, BitSet,
> FetchConfiguration, int, Object) line: 78
>       StateManagerImpl.loadFields(BitSet, FetchConfiguration, int,
> Object) line: 2921
>       StateManagerImpl.loadField(int, int, boolean, boolean) line:
> 2999
>       StateManagerImpl.fetchObjectField(int) line: 2242
>       StateManagerImpl.fetchField(int, boolean) line: 778
>       StateManagerImpl.fetch(int) line: 740
>       RedefinitionHelper$1.invoke(Object, Method, Object[]) line: 230
> 
>       $Proxy130.iterator() line: not available
>       [deleted]
> 
> The fields of the class in question are:
> 
>     @Id
>     private String  id;
>     @Basic
>     private String  displayName;
>     @Temporal(TemporalType.DATE)
>     private Date    creationDate;
>     @OneToMany(fetch = FetchType.EAGER)
>     private Set<Category>   childCategories;
> 
> The relevant portion of the orm.xml file is this:
> 
>    <entity name="Category" class="...domain.Category">
>         <table name="CATEGORY"/>
>         <attributes>
>             <id name="id">
>                 <column name="CATEGORY_ID"/>
>             </id>
>             <one-to-many name="childCategories"
> target-entity="Category">
>                 <join-table name="CAT_CHLDCAT">
>                     <join-column name="CATEGORY_ID"
> referenced-column-name="CATEGORY_ID"/>
>                     <inverse-join-column name="CHILD_CAT_ID"
> referenced-column-name="CATEGORY_ID"/>
>                 </join-table>
>             </one-to-many>
>         </attributes>
>     </entity>

I have a little more information, but I'm not sure what to make of it.

I think I'm still not using enhanced classes at runtime.  I was able to
complete the build-time enhancement, but I can't figure out how to
deploy those enhanced classes to WebLogic from within Eclipse.  I've
written a separate note on that.

Perhaps this is the cause of my current problem, perhaps not.

To review my domain, I have a "Catalog" with "rootCategories", and
"Category" with "childCategories".  I have one test for a Catalog that
has two "rootCategories", but neither of which has any
"childCategories".  This test works fine.  I have another test with a
Catalog that has a Category that has at least one child category.  This
gets a NPE when I try to reference the "childCategories" association of
the child Category, which according to my database would be an empty
list.  Both associations are specified in annotations as EAGER fetching.

After I get the Catalog entity from the EntityManager, I iterate through
the tree, cloning the object and collections, and printing the values of
the basic fields as I examine each object.  This process fails with the
NPE.  The following is some of my console output, showing the stack
trace, and some of my debugging output:

845426  dynamicContent  INFO   [[ACTIVE] ExecuteThread: '2' for queue:
'weblogic.kernel.Default (self-tuning)'] openjpa.Runtime - Starting
OpenJPA 1.2.1
850566  dynamicContent  TRACE  [[ACTIVE] ExecuteThread: '2' for queue:
'weblogic.kernel.Default (self-tuning)'] openjpa.jdbc.SQL - <t
-1701320760, conn 6> executing prepstmnt 7 SELECT t0.CREATION_DATE,
t0.DISPLAY_NAME, t1.CATALOG_ID, t2.CATEGORY_ID, t2.CREATION_DATE,
t2.DISPLAY_NAME FROM CATALOG t0, ROOT_CATS t1, CATEGORY t2 WHERE
t0.CATALOG_ID = ? AND t0.CATALOG_ID = t1.CATALOG_ID(+) AND
t1.ROOT_CAT_ID = t2.CATEGORY_ID(+) [params=(String) catalog1270003]
850660  dynamicContent  TRACE  [[ACTIVE] ExecuteThread: '2' for queue:
'weblogic.kernel.Default (self-tuning)'] openjpa.jdbc.SQL - <t
-1701320760, conn 6> [94 ms] spent
850769  dynamicContent  TRACE  [[ACTIVE] ExecuteThread: '2' for queue:
'weblogic.kernel.Default (self-tuning)'] openjpa.jdbc.SQL - <t
-1701320760, conn 6> executing prepstmnt 9 SELECT t1.CATEGORY_ID,
t1.CREATION_DATE, t1.DISPLAY_NAME FROM CAT_CHLDCAT t0, CATEGORY t1 WHERE
t0.CATEGORY_ID = ? AND t0.CHILD_CAT_ID = t1.CATEGORY_ID [params=(String)
cat30012]
850769  dynamicContent  TRACE  [[ACTIVE] ExecuteThread: '2' for queue:
'weblogic.kernel.Default (self-tuning)'] openjpa.jdbc.SQL - <t
-1701320760, conn 6> [0 ms] spent
850785  dynamicContent  TRACE  [[ACTIVE] ExecuteThread: '2' for queue:
'weblogic.kernel.Default (self-tuning)'] openjpa.jdbc.SQL - <t
-1701320760, conn 6> executing prepstmnt 11 SELECT t1.CATEGORY_ID,
t1.CREATION_DATE, t1.DISPLAY_NAME FROM CAT_CHLDCAT t0, CATEGORY t1 WHERE
t0.CATEGORY_ID = ? AND t0.CHILD_CAT_ID = t1.CATEGORY_ID [params=(String)
cat30020]
850785  dynamicContent  TRACE  [[ACTIVE] ExecuteThread: '2' for queue:
'weblogic.kernel.Default (self-tuning)'] openjpa.jdbc.SQL - <t
-1701320760, conn 6> [0 ms] spent
850785  dynamicContent  TRACE  [[ACTIVE] ExecuteThread: '2' for queue:
'weblogic.kernel.Default (self-tuning)'] openjpa.jdbc.SQL - <t
-1701320760, conn 6> executing prepstmnt 13 SELECT t1.CATEGORY_ID,
t1.CREATION_DATE, t1.DISPLAY_NAME FROM CAT_CHLDCAT t0, CATEGORY t1 WHERE
t0.CATEGORY_ID = ? AND t0.CHILD_CAT_ID = t1.CATEGORY_ID [params=(String)
cat30031]
850785  dynamicContent  TRACE  [[ACTIVE] ExecuteThread: '2' for queue:
'weblogic.kernel.Default (self-tuning)'] openjpa.jdbc.SQL - <t
-1701320760, conn 6> [0 ms] spent
850800  dynamicContent  TRACE  [[ACTIVE] ExecuteThread: '2' for queue:
'weblogic.kernel.Default (self-tuning)'] openjpa.jdbc.SQL - <t
-1701320760, conn 6> executing prepstmnt 15 SELECT t1.CATEGORY_ID,
t1.CREATION_DATE, t1.DISPLAY_NAME FROM CAT_CHLDCAT t0, CATEGORY t1 WHERE
t0.CATEGORY_ID = ? AND t0.CHILD_CAT_ID = t1.CATEGORY_ID [params=(String)
cat30041]
850800  dynamicContent  TRACE  [[ACTIVE] ExecuteThread: '2' for queue:
'weblogic.kernel.Default (self-tuning)'] openjpa.jdbc.SQL - <t
-1701320760, conn 6> [0 ms] spent
850800  dynamicContent  TRACE  [[ACTIVE] ExecuteThread: '2' for queue:
'weblogic.kernel.Default (self-tuning)'] openjpa.jdbc.SQL - <t
-1701320760, conn 6> executing prepstmnt 17 SELECT t1.CATEGORY_ID,
t1.CREATION_DATE, t1.DISPLAY_NAME FROM CAT_CHLDCAT t0, CATEGORY t1 WHERE
t0.CATEGORY_ID = ? AND t0.CHILD_CAT_ID = t1.CATEGORY_ID [params=(String)
cat80110]
850800  dynamicContent  TRACE  [[ACTIVE] ExecuteThread: '2' for queue:
'weblogic.kernel.Default (self-tuning)'] openjpa.jdbc.SQL - <t
-1701320760, conn 6> [0 ms] spent
<Dec 15, 2009 11:10:49 AM PST> <Notice> <Stdout> <BEA-000000>
<showAnnotations.
clazz[org.apache.openjpa.enhance.com$att$ecom$dynamiccontent$domain$Cata
log$pcsubclass]> 
<Dec 15, 2009 11:10:49 AM PST> <Notice> <Stdout> <BEA-000000>
<annotations.length[0]> 
<Dec 15, 2009 11:10:49 AM PST> <Notice> <Stdout> <BEA-000000>
<showAnnotations. clazz[com.att.ecom.dynamiccontent.domain.Catalog]> 
<Dec 15, 2009 11:10:49 AM PST> <Notice> <Stdout> <BEA-000000>
<annotations.length[2]> 
<Dec 15, 2009 11:10:49 AM PST> <Notice> <Stdout> <BEA-000000>
<annotation.name[$Proxy57]> 
<Dec 15, 2009 11:10:49 AM PST> <Notice> <Stdout> <BEA-000000>
<annotation.name[$Proxy103]> 
<Dec 15, 2009 11:10:49 AM PST> <Notice> <Stdout> <BEA-000000> <Cloning a
Catalog. level[0]> 
<Dec 15, 2009 11:10:49 AM PST> <Notice> <Stdout> <BEA-000000>
<category[Features] id[cat30012]> 
<Dec 15, 2009 11:10:49 AM PST> <Notice> <Stdout> <BEA-000000> <Cloning a
Category. level[1]> 
<Dec 15, 2009 11:10:49 AM PST> <Notice> <Stdout> <BEA-000000>
<child.category[Prepaid] id[cat30019]> 
<Dec 15, 2009 11:10:49 AM PST> <Notice> <Stdout> <BEA-000000> <Cloning a
Category. level[2]> 
851035  dynamicContent  TRACE  [[ACTIVE] ExecuteThread: '2' for queue:
'weblogic.kernel.Default (self-tuning)'] openjpa.jdbc.SQL - <t
-1701320760, conn 19> executing prepstmnt 20 SELECT t1.CATEGORY_ID,
t1.CREATION_DATE, t1.DISPLAY_NAME FROM CAT_CHLDCAT t0, CATEGORY t1 WHERE
t0.CATEGORY_ID = ? AND t0.CHILD_CAT_ID = t1.CATEGORY_ID [params=(String)
cat30019]
851035  dynamicContent  TRACE  [[ACTIVE] ExecuteThread: '2' for queue:
'weblogic.kernel.Default (self-tuning)'] openjpa.jdbc.SQL - <t
-1701320760, conn 19> [0 ms] spent
Dec 15, 2009 11:10:49 AM org.apache.cxf.phase.PhaseInterceptorChain
doIntercept
WARNING: Application has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault
        at
org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvok
er.java:155)
        at
org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.ja
va:121)
        [deleted]
Caused by: java.lang.NullPointerException
        at
org.apache.openjpa.enhance.com$att$ecom$dynamiccontent$domain$Category$p
csubclass.pcReplaceField(Unknown Source)
        at
org.apache.openjpa.kernel.StateManagerImpl.replaceField(StateManagerImpl
.java:3025)
        at
org.apache.openjpa.kernel.StateManagerImpl.storeObjectField(StateManager
Impl.java:2457)
        at
org.apache.openjpa.kernel.StateManagerImpl.storeObject(StateManagerImpl.
java:2447)
        at
org.apache.openjpa.jdbc.meta.strats.StoreCollectionFieldStrategy.load(St
oreCollectionFieldStrategy.java:569)
        at
org.apache.openjpa.jdbc.meta.FieldMapping.load(FieldMapping.java:819)
        at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.ja
va:688)
        at
org.apache.openjpa.kernel.DelegatingStoreManager.load(DelegatingStoreMan
ager.java:116)
        at
org.apache.openjpa.kernel.ROPStoreManager.load(ROPStoreManager.java:78)
        at
org.apache.openjpa.kernel.StateManagerImpl.loadFields(StateManagerImpl.j
ava:2921)
        at
org.apache.openjpa.kernel.StateManagerImpl.loadField(StateManagerImpl.ja
va:2999)
        at
org.apache.openjpa.kernel.StateManagerImpl.fetchObjectField(StateManager
Impl.java:2242)
        at
org.apache.openjpa.kernel.StateManagerImpl.fetchField(StateManagerImpl.j
ava:778)
        at
org.apache.openjpa.kernel.StateManagerImpl.fetch(StateManagerImpl.java:7
40)
        at
org.apache.openjpa.enhance.RedefinitionHelper$1.invoke(RedefinitionHelpe
r.java:230)
        at $Proxy104.iterator(Unknown Source)
        at
com.att.ecom.dynamiccontent.content.Content.clone(Content.java:69)


Reply via email to