You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-user@db.apache.org by Gus Heck <gu...@olin.edu> on 2004/01/02 20:50:21 UTC
Re: NPE in OjbExtent
Any further thoughts?
Gus Heck wrote:
> Hi Thomas,
>
> I tried that, and I still seem to get the same problem.
>
> -Gus
>
> Thomas Mahler wrote:
>
>> Hi Gus,
>>
>> Gus Heck wrote:
>>
>>> Hi Thomas,
>>>
>>> I don't think I did anything exotic in terms of commands executed...
>>>
>>> public static IdManager findIdManager(Class c) {
>>> if (!loadedOK) { // flag for lazy init
>>
>>
>>
>> // please try the following:
>>
>> // PersistenceManagerFactory pmf =
>> PersistenceHelper.getPMF();
>> PersistenceManagerFactory pmf = ObjStorePMF.getInstance();
>>
>>
>>> IdManager.pm = pmf.getPersistenceManager();
>>> System.out.println(IdManager.pm); // this does print a
>>> PMWrapper object
>>> Extent ex = IdManager.pm.getExtent(IdManager.class,true);
>>> // <<<<< Exception here
>>>
>>> For reference:
>>>
>>> public static PersistenceManagerFactory getPMF() {
>>> return pmf;
>>> }
>>>
>>> pmf is loaded in a static initializer with this statement:
>>>
>>> pmf = new OjbStorePMF();
>>>
>>> Which I believe I lifted from the website somewhere.
>>> PersistanceHelper is a non-instantiable class, and pmf is a public
>>> final static, so there can be only one. The call to findIdManager
>>> occurs when I try to create an instance of LocationImpl (a
>>> non-persistant class) Location impl contains the line:
>>>
>>> private static IdManager idMgr =
>>> IdManager.findIdManager(LocationBase.class);
>>>
>>> Moving this out of class init and into lazy initialization does
>>> nothing but allow junit to print the full stack trace for each test
>>> each time rather than one stack trace and several class not found
>>> errors. This error occurs when the code is deployed to tomcat too,
>>> so I don't beleive it is related to running under Junit.
>>>
>>> -Gus
>>>
>>> For reference here is my JDO file..
>>>
>>> <?xml version="1.0" encoding="UTF-8"?>
>>> <!DOCTYPE jdo PUBLIC "-//Sun Microsystems, Inc.//DTD Java Data
>>> Objects Metadata 1.0//EN" "http://java.sun.com/dtd/jdo_1_0.dtd">
>>>
>>> <jdo>
>>> <package name="org.cs101.fdb.impl.jdo">
>>> <class name="IdManager"
>>> identity-type="application"
>>> > <!-- end class tag -->
>>> </class>
>>> <class name="LocationBase"
>>> identity-type="application"
>>> > <!-- end class tag -->
>>> </class>
>>> </package>
>>>
>>> <!--
>>> To use additional vendor extensions, create a
>>> vendor-extensions.xml file that
>>> contains the additional extensions (in extension tags) and place
>>> it in your
>>> projects merge dir.
>>> -->
>>>
>>> </jdo>
>>>
>>> and the repository.xml info for IdManager:
>>>
>>> <class-descriptor
>>> class="org.cs101.fdb.impl.jdo.IdManager"
>>> table="IdManager"
>>> >
>>> <field-descriptor
>>> name="id"
>>> column="id"
>>> jdbc-type="INTEGER"
>>> primarykey="true"
>>> >
>>> </field-descriptor>
>>> <field-descriptor
>>> name="className"
>>> column="className"
>>> jdbc-type="VARCHAR"
>>> length="256"
>>> >
>>> </field-descriptor>
>>> <field-descriptor
>>> name="lastId"
>>> column="lastId"
>>> jdbc-type="INTEGER"
>>> >
>>> </field-descriptor>
>>> </class-descriptor>
>>>
>>>
>>> -gus
>>>
>>>
>>> Thomas Mahler wrote:
>>>
>>>> Hi Gus,
>>>>
>>>> I assume that there is a wrong sequence of initialization calls.
>>>> EIther in your code or in mine...
>>>>
>>>> By just looking at you stacktrace I don't get an idea what might
>>>> have gone wrong.
>>>>
>>>> Please post the relevant code that provoke the error. It looks as
>>>> if some things are not yet initialized when you try to access the
>>>> connector....
>>>>
>>>> cu,
>>>> Thomas
>>>>
>>>> Gus Heck wrote:
>>>>
>>>>> Well I made the mistake of trying to enter a bug in scarab
>>>>> again... and again it wasted my time..... I wish you folks would
>>>>> get a bugzilla.
>>>>>
>>>>> All the formatting was eaten by scarab, which of course makes
>>>>> stack traces illegible. Again I am posting my bug here where it
>>>>> might be possbile to understand it.
>>>>>
>>>>> I had JDO working fine with a protype web app that just had a
>>>>> single PC class. I added a second PC class that is supposed to
>>>>> manage Id's across my application. Since the next ID number needs
>>>>> to persist it is a JDO enhanced class as well. I suspect however
>>>>> it gets used substantially earlier in the program, since it is
>>>>> referenced in several class initializers. Now I am getting the
>>>>> following Exception when my IdManager class tries to use an extent
>>>>> to get a list of instances (of class IdManager). Each instance
>>>>> manages Id's for a single PC class. Before reporting this I
>>>>> upgraded to the cvs checkout of RC5 (was using CVS of RC4 compiled
>>>>> somewhere around 12/1) Both versions have this problem. I tweaked
>>>>> the build to give you line numbers for the OJB stuff too.
>>>>>
>>>>> java.lang.ExceptionInInitializerError
>>>>> at
>>>>> org.cs101.fdb.impl.jdo.JDOFactory.createLocation(JDOFactory.java:32)
>>>>> at org.cs101.fdb.test.LocationTest.setUp(LocationTest.java:46)
>>>>> Caused by: java.lang.NullPointerException
>>>>> at
>>>>> org.apache.ojb.jdori.sql.OjbExtent.<init>(OjbExtent.java:98)
>>>>> at
>>>>> org.apache.ojb.jdori.sql.OjbStoreManager.getExtent(OjbStoreManager.java:251)
>>>>>
>>>>> at
>>>>> com.sun.jdori.common.PersistenceManagerImpl.getExtent(Unknown Source)
>>>>> at
>>>>> com.sun.jdori.common.PersistenceManagerWrapper.getExtent(Unknown
>>>>> Source)
>>>>> at
>>>>> org.cs101.fdb.impl.jdo.IdManager.findIdManager(IdManager.java:63)
>>>>> at
>>>>> org.cs101.fdb.impl.jdo.LocationImpl.<clinit>(LocationImpl.java:51)
>>>>> ... 11 more
>>>>>
>>>>> Looking at the code It seems that OjbStoreManager is calling
>>>>> connector.getBroker and getting null which it is then passing to
>>>>> the OjbExtent constructor.
>>>>>
>>>>> -Gus
>>>>>
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
>>>>> For additional commands, e-mail: ojb-user-help@db.apache.org
>>>>>
>>>>>
>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
>>>> For additional commands, e-mail: ojb-user-help@db.apache.org
>>>>
>>>
>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
>>> For additional commands, e-mail: ojb-user-help@db.apache.org
>>>
>>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
>> For additional commands, e-mail: ojb-user-help@db.apache.org
>>
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
> For additional commands, e-mail: ojb-user-help@db.apache.org
>
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org
Re: NPE in OjbExtent (solved)
Posted by Gus Heck <gu...@olin.edu>.
The solution is two fold:
1. I'm an Idiot. I forgot to start a transaction before requesting an
extent. duh. Starting a transaction fixes the problem.
2. OJB failed to notice this and proceeded happily on it's way and threw
a plain old vanilla, tell you nothing NPE.
So I've fixed my code and here is a fix for yours...
Index: src/jdori/org/apache/ojb/jdori/sql/OjbStoreConnector.java
===================================================================
RCS file:
/home/cvspublic/db-ojb/src/jdori/org/apache/ojb/jdori/sql/OjbStoreConnector.java,v
retrieving revision 1.1
diff -u -r1.1 OjbStoreConnector.java
--- src/jdori/org/apache/ojb/jdori/sql/OjbStoreConnector.java 24 Dec
2002 12:06:01 -0000 1.1
+++ src/jdori/org/apache/ojb/jdori/sql/OjbStoreConnector.java 21 Jan
2004 20:52:23 -0000
@@ -62,6 +62,8 @@
import com.sun.jdori.Connector;
+import javax.jdo.JDOUserException;
+
/**
* OjbStoreConnector represents a OJB PB connection
*
@@ -214,6 +216,9 @@
*/
public PersistenceBroker getBroker()
{
+ if (broker == null) {
+ throw new JDOUserException("No transaction in progress.");
+ }
return broker;
}
HTH,
Gus
Gus Heck wrote:
> Any further thoughts?
>
> Gus Heck wrote:
>
>> Hi Thomas,
>>
>> I tried that, and I still seem to get the same problem.
>>
>> -Gus
>>
>> Thomas Mahler wrote:
>>
>>> Hi Gus,
>>>
>>> Gus Heck wrote:
>>>
>>>> Hi Thomas,
>>>>
>>>> I don't think I did anything exotic in terms of commands executed...
>>>>
>>>> public static IdManager findIdManager(Class c) {
>>>> if (!loadedOK) { // flag for lazy init
>>>
>>>
>>>
>>>
>>> // please try the following:
>>>
>>> // PersistenceManagerFactory pmf =
>>> PersistenceHelper.getPMF();
>>> PersistenceManagerFactory pmf = ObjStorePMF.getInstance();
>>>
>>>
>>>> IdManager.pm = pmf.getPersistenceManager();
>>>> System.out.println(IdManager.pm); // this does print a
>>>> PMWrapper object
>>>> Extent ex =
>>>> IdManager.pm.getExtent(IdManager.class,true); // <<<<< Exception here
>>>>
>>>> For reference:
>>>>
>>>> public static PersistenceManagerFactory getPMF() {
>>>> return pmf;
>>>> }
>>>>
>>>> pmf is loaded in a static initializer with this statement:
>>>>
>>>> pmf = new OjbStorePMF();
>>>>
>>>> Which I believe I lifted from the website somewhere.
>>>> PersistanceHelper is a non-instantiable class, and pmf is a public
>>>> final static, so there can be only one. The call to findIdManager
>>>> occurs when I try to create an instance of LocationImpl (a
>>>> non-persistant class) Location impl contains the line:
>>>>
>>>> private static IdManager idMgr =
>>>> IdManager.findIdManager(LocationBase.class);
>>>>
>>>> Moving this out of class init and into lazy initialization does
>>>> nothing but allow junit to print the full stack trace for each test
>>>> each time rather than one stack trace and several class not found
>>>> errors. This error occurs when the code is deployed to tomcat too,
>>>> so I don't beleive it is related to running under Junit.
>>>>
>>>> -Gus
>>>>
>>>> For reference here is my JDO file..
>>>>
>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>> <!DOCTYPE jdo PUBLIC "-//Sun Microsystems, Inc.//DTD Java Data
>>>> Objects Metadata 1.0//EN" "http://java.sun.com/dtd/jdo_1_0.dtd">
>>>>
>>>> <jdo>
>>>> <package name="org.cs101.fdb.impl.jdo">
>>>> <class name="IdManager"
>>>> identity-type="application"
>>>> > <!-- end class tag -->
>>>> </class>
>>>> <class name="LocationBase"
>>>> identity-type="application"
>>>> > <!-- end class tag -->
>>>> </class>
>>>> </package>
>>>>
>>>> <!--
>>>> To use additional vendor extensions, create a
>>>> vendor-extensions.xml file that
>>>> contains the additional extensions (in extension tags) and place
>>>> it in your
>>>> projects merge dir.
>>>> -->
>>>>
>>>> </jdo>
>>>>
>>>> and the repository.xml info for IdManager:
>>>>
>>>> <class-descriptor
>>>> class="org.cs101.fdb.impl.jdo.IdManager"
>>>> table="IdManager"
>>>> >
>>>> <field-descriptor
>>>> name="id"
>>>> column="id"
>>>> jdbc-type="INTEGER"
>>>> primarykey="true"
>>>> >
>>>> </field-descriptor>
>>>> <field-descriptor
>>>> name="className"
>>>> column="className"
>>>> jdbc-type="VARCHAR"
>>>> length="256"
>>>> >
>>>> </field-descriptor>
>>>> <field-descriptor
>>>> name="lastId"
>>>> column="lastId"
>>>> jdbc-type="INTEGER"
>>>> >
>>>> </field-descriptor>
>>>> </class-descriptor>
>>>>
>>>>
>>>> -gus
>>>>
>>>>
>>>> Thomas Mahler wrote:
>>>>
>>>>> Hi Gus,
>>>>>
>>>>> I assume that there is a wrong sequence of initialization calls.
>>>>> EIther in your code or in mine...
>>>>>
>>>>> By just looking at you stacktrace I don't get an idea what might
>>>>> have gone wrong.
>>>>>
>>>>> Please post the relevant code that provoke the error. It looks as
>>>>> if some things are not yet initialized when you try to access the
>>>>> connector....
>>>>>
>>>>> cu,
>>>>> Thomas
>>>>>
>>>>> Gus Heck wrote:
>>>>>
>>>>>> Well I made the mistake of trying to enter a bug in scarab
>>>>>> again... and again it wasted my time..... I wish you folks would
>>>>>> get a bugzilla.
>>>>>>
>>>>>> All the formatting was eaten by scarab, which of course makes
>>>>>> stack traces illegible. Again I am posting my bug here where it
>>>>>> might be possbile to understand it.
>>>>>>
>>>>>> I had JDO working fine with a protype web app that just had a
>>>>>> single PC class. I added a second PC class that is supposed to
>>>>>> manage Id's across my application. Since the next ID number needs
>>>>>> to persist it is a JDO enhanced class as well. I suspect however
>>>>>> it gets used substantially earlier in the program, since it is
>>>>>> referenced in several class initializers. Now I am getting the
>>>>>> following Exception when my IdManager class tries to use an
>>>>>> extent to get a list of instances (of class IdManager). Each
>>>>>> instance manages Id's for a single PC class. Before reporting
>>>>>> this I upgraded to the cvs checkout of RC5 (was using CVS of RC4
>>>>>> compiled somewhere around 12/1) Both versions have this problem.
>>>>>> I tweaked the build to give you line numbers for the OJB stuff too.
>>>>>>
>>>>>> java.lang.ExceptionInInitializerError
>>>>>> at
>>>>>> org.cs101.fdb.impl.jdo.JDOFactory.createLocation(JDOFactory.java:32)
>>>>>> at
>>>>>> org.cs101.fdb.test.LocationTest.setUp(LocationTest.java:46)
>>>>>> Caused by: java.lang.NullPointerException
>>>>>> at
>>>>>> org.apache.ojb.jdori.sql.OjbExtent.<init>(OjbExtent.java:98)
>>>>>> at
>>>>>> org.apache.ojb.jdori.sql.OjbStoreManager.getExtent(OjbStoreManager.java:251)
>>>>>>
>>>>>> at
>>>>>> com.sun.jdori.common.PersistenceManagerImpl.getExtent(Unknown
>>>>>> Source)
>>>>>> at
>>>>>> com.sun.jdori.common.PersistenceManagerWrapper.getExtent(Unknown
>>>>>> Source)
>>>>>> at
>>>>>> org.cs101.fdb.impl.jdo.IdManager.findIdManager(IdManager.java:63)
>>>>>> at
>>>>>> org.cs101.fdb.impl.jdo.LocationImpl.<clinit>(LocationImpl.java:51)
>>>>>> ... 11 more
>>>>>>
>>>>>> Looking at the code It seems that OjbStoreManager is calling
>>>>>> connector.getBroker and getting null which it is then passing to
>>>>>> the OjbExtent constructor.
>>>>>>
>>>>>> -Gus
>>>>>>
>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>>
>>>>>> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
>>>>>> For additional commands, e-mail: ojb-user-help@db.apache.org
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
>>>>> For additional commands, e-mail: ojb-user-help@db.apache.org
>>>>>
>>>>
>>>>
>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
>>>> For additional commands, e-mail: ojb-user-help@db.apache.org
>>>>
>>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
>>> For additional commands, e-mail: ojb-user-help@db.apache.org
>>>
>>
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
>> For additional commands, e-mail: ojb-user-help@db.apache.org
>>
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
> For additional commands, e-mail: ojb-user-help@db.apache.org
>
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org