> -----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)