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 Mahler Thomas <th...@itellium.com> on 2003/08/08 16:48:09 UTC

RE: JDO - Objects fetched from DB are in transient state, not per sistent

Hi Ketan,

> 
> Thomas,
> 
> I was wondering if you'd been able to determine the right way 
> to proceed 
> with this.  

I hope to fix the problem within the next 3 weeks.

> If I understood correctly before, the JDO layer is broken 
> and has been for some time.  But that can't be right, since 
> other people 
> are using JDO. 
It's not really broker. you can use it and insert and update objects. The
JDO tutorial application is running without problems!

The only problem seems to be that I did not manage to transfer the correct
state information during the retrieval of extents. Only if you rely on this
state information you'll get problems...

> Regardless, I hope you find the solution; 
> it's kind of 
> hard to use JDO when it's read-only :-).  Thanks.

it stays on my todo list untils it's fixed!

cheers,
Thomas

> 
> 
> Thomas Mahler wrote:
> > Hi Ketan,
> > 
> > Ketan Gangatirkar wrote:
> > 
> >>
> >> Thomas,
> >>
> >> I've been stepping through the OBJ JDO and JDORI code.  I have 
> >> determined that the PersistenceCapable objects never are 
> assigned a 
> >> StateManager (member jdoStateManager) when they are 
> assembled from a 
> >> row result.
> > 
> > 
> > That's exactly the problem! I'm currently researching how 
> to solve this 
> > issue.
> > 
> >>  When an object is created and persisted, it does get assigned a 
> >> StateManager, but I see no corresponding assignment for objects 
> >> fetched from the DB.  
> > 
> > 
> > I does does happen when objects are retrieved by Identity in 
> > OjbStoreManager.fetch.
> > 
> > But it does not happen when loading object via a query or a 
> whole Extent.
> > 
> > I'm currently trying to implement the StateManager assignment  in 
> > OjbExtent too. But it's not as easy as I hoped...
> > 
> > I'll need a closer look at the JDORI again...
> > 
> > cheers,
> > Thomas
> 
> 
> ---------------------------------------------------------------------
> 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: JDO - Objects fetched from DB are in transient state, not per sistent

Posted by Ketan Gangatirkar <ja...@ketan.org>.
Thomas,

I tried your suggestion.  I don't know how to interpret the results, 
though :-).  I changed the code fragment to:

========

     PersistenceManagerFactory pmf = new OjbStorePMF();
     PersistenceManager pm = pmf.getPersistenceManager();
     PersistenceBrokerFactory.defaultPersistenceBroker().clearCache();

     pm.currentTransaction().begin();
     Extent extent = pm.getExtent(Building.class, false);
     for (Iterator iterator = extent.iterator();
         iterator.hasNext();)
     {
         Building b = (Building) iterator.next();
     }

     pm.currentTransaction().commit();

     Building example = new Building();
     example.setBuildingID(4);
     Identity oid = new Identity(example);
     pm.currentTransaction().begin();

     Building building = (Building) pm.getObjectById(oid, false);

========

However, I am still getting the same exception:

========

javax.jdo.JDOUserException: Given object is not a valid OID.
FailedObject:org.lbjnow.calvin.location.Building{4}
NestedThrowables:
java.lang.IllegalArgumentException: arg1
	at com.sun.jdori.common.CacheManagerImpl.createNewSM(Unknown Source)
	at com.sun.jdori.common.CacheManagerImpl.getStateManager(Unknown Source)
	at com.sun.jdori.common.CacheManagerImpl.getObjectById(Unknown Source)
	at com.sun.jdori.common.PersistenceManagerImpl.getObjectById(Unknown 
Source)
	at com.sun.jdori.common.PersistenceManagerWrapper.getObjectById(Unknown 
Source)
	at org.apache.jsp.tj_jsp._jspService(tj_jsp.java:143)

========

I haven't had any problems using getObjectById() on objects that have 
just been persisted (consistent with the root problem), if I remember 
correctly.  Also, as before, when I iterate through the Extent, the 
objects all return false to jdoIsPersistent().  I also tried 
pm.getObjectById(new Identity(b)) from within the Extent iteration loop, 
which threw the same JDOUserException.

I can't tell if this is good news or bad; hopefully this gives you 
enough information to tell.  If nothing else, it's consistent!



Thomas Mahler wrote:

> Hi Ketan,
> 
> Ketan Gangatirkar wrote:
> 
>>
>> Thomas,
>>
>> I tried using the method in tutorial4 to look up objects by OID, but I 
>> kept getting "javax.jdo.JDOUserException: Given object is not a valid 
>> OID."  This is the relevant code section, basically copied out of 
>> org.apache.ojb.tutorial5.UCEditProduct and adapted slightly:
>>
>> ========
>>
>>     PersistenceManagerFactory pmf = new OjbStorePMF();
>>     PersistenceManager pm = pmf.getPersistenceManager();
>>
>>     Building example = new Building();
>>     example.setBuildingID(4);
>>
>>     Identity oid = new Identity(example);
>>     pm.currentTransaction().begin();
>>
>>     Building building = (Building) pm.getObjectById(oid, false);
>>
>> ========
> 
> 
> 
> Mhh, that's quite strange! that's the virtually the same code as in my 
> UCEdit Example.
> I definitely works with the Product class. Do you get the OJB JDO 
> tutorial app running with the UCEdit usecase on your machine?
> 
> AFter looking clsoer at the JDORI I have an idea:
> The problem could be caused because in my UCEdit the object to lookup is 
> already in the JDORI cache. In your it is not and the cache wants to 
> create a new SM, which then fails.
> 
> you could try to load the complete extent of your Building objects and 
> iterate through it before calling your code fragment.
> If it works, my assumption is correct, and I have even more work to do :-(
> 
> cheers,
> Thomas
> 
>> oid.toString() returns "org.lbjnow.calvin.location.Building{4}" which 
>> certainly looks plausible.
>>
>> As a result, the work-around does not work :-/.  This happens with all 
>> my objects; I just picked the simplest to demonstrate.  The 
>> repository_user.xml section is:
>>
>> ========
>>
>> <class-descriptor class="org.lbjnow.calvin.location.Building"
>>     table="building">
>> <field-descriptor id="1" name="buildingID" column="building_id"
>>     jdbc-type="INTEGER" primarykey="true"  autoincrement="true"
>>     sequence-name="building_id_seq" />
>> <field-descriptor id="2" name="shortName" column="short_name"
>>     jdbc-type="VARCHAR"/>
>> <field-descriptor id="3" name="longName" column="long_name"
>>     jdbc-type="VARCHAR"/>
>> </class-descriptor>
>>
>> ========
>>
>> The part of the .jdo file for that class is:
>>
>> ========
>>
>> <class name="Building" identity-type="application"
>>     objectid-class="java.lang.Integer">
>>     <field name="buildingID" primary-key="true"
>>         null-value="exception" />
>>     <field name="shortName" />
>>     <field name="longName" />
>> </class>
>>
>> ========
>>
>> The class itself is rather simple right now, with just the fields 
>> listed above and the appropriate getter/setter methods.  The rest of 
>> the exception looks like this:
>>
>> ========
>>
>> javax.jdo.JDOUserException: Given object is not a valid OID.
>> FailedObject:org.lbjnow.calvin.location.Building{4}
>> NestedThrowables:
>> java.lang.IllegalArgumentException: arg1
>>     at com.sun.jdori.common.CacheManagerImpl.createNewSM(Unknown Source)
>>     at com.sun.jdori.common.CacheManagerImpl.getStateManager(Unknown 
>> Source)
>>     at com.sun.jdori.common.CacheManagerImpl.getObjectById(Unknown 
>> Source)
>>     at 
>> com.sun.jdori.common.PersistenceManagerImpl.getObjectById(Unknown Source)
>>     at 
>> com.sun.jdori.common.PersistenceManagerWrapper.getObjectById(Unknown 
>> Source)
>>     at org.apache.jsp.tj_jsp._jspService(tj_jsp.java:83)
>>
>> ========
>>
>> If I can get lookups to work this way, that would certainly suffice 
>> for my needs.
>>
>>
>>
>> Thomas Mahler wrote:
>>
>>> Hi again ketan,
>>>
>>> Ketan Gangatirkar wrote:
>>>
>>>>>
>>>>> The only problem seems to be that I did not manage to transfer the 
>>>>> correct
>>>>> state information during the retrieval of extents. Only if you rely 
>>>>> on this
>>>>> state information you'll get problems...
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> Ah, there it is.  I have this problem when retrieving objects from 
>>>> JDOQL queries as well as using the methods defined by Extent.  Did I 
>>>> misunderstand you?
>>>
>>>
>>>
>>>
>>> No, that's what I meant. JDOQL queries rely on extents, that's why.
>>> The tutorial app does only edit objects based on a primary key lookup...
>>
>>
>>
>>
>>
>> ---------------------------------------------------------------------
>> 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: JDO - Objects fetched from DB are in transient state, not per sistent

Posted by Thomas Mahler <th...@web.de>.
Hi Ketan,

Ketan Gangatirkar wrote:
> 
> Thomas,
> 
> I tried using the method in tutorial4 to look up objects by OID, but I 
> kept getting "javax.jdo.JDOUserException: Given object is not a valid 
> OID."  This is the relevant code section, basically copied out of 
> org.apache.ojb.tutorial5.UCEditProduct and adapted slightly:
> 
> ========
> 
>     PersistenceManagerFactory pmf = new OjbStorePMF();
>     PersistenceManager pm = pmf.getPersistenceManager();
> 
>     Building example = new Building();
>     example.setBuildingID(4);
> 
>     Identity oid = new Identity(example);
>     pm.currentTransaction().begin();
> 
>     Building building = (Building) pm.getObjectById(oid, false);
> 
> ========


Mhh, that's quite strange! that's the virtually the same code as in my 
UCEdit Example.
I definitely works with the Product class. Do you get the OJB JDO 
tutorial app running with the UCEdit usecase on your machine?

AFter looking clsoer at the JDORI I have an idea:
The problem could be caused because in my UCEdit the object to lookup is 
already in the JDORI cache. In your it is not and the cache wants to 
create a new SM, which then fails.

you could try to load the complete extent of your Building objects and 
iterate through it before calling your code fragment.
If it works, my assumption is correct, and I have even more work to do :-(

cheers,
Thomas

> oid.toString() returns "org.lbjnow.calvin.location.Building{4}" which 
> certainly looks plausible.
> 
> As a result, the work-around does not work :-/.  This happens with all 
> my objects; I just picked the simplest to demonstrate.  The 
> repository_user.xml section is:
> 
> ========
> 
> <class-descriptor class="org.lbjnow.calvin.location.Building"
>     table="building">
> <field-descriptor id="1" name="buildingID" column="building_id"
>     jdbc-type="INTEGER" primarykey="true"  autoincrement="true"
>     sequence-name="building_id_seq" />
> <field-descriptor id="2" name="shortName" column="short_name"
>     jdbc-type="VARCHAR"/>
> <field-descriptor id="3" name="longName" column="long_name"
>     jdbc-type="VARCHAR"/>
> </class-descriptor>
> 
> ========
> 
> The part of the .jdo file for that class is:
> 
> ========
> 
> <class name="Building" identity-type="application"
>     objectid-class="java.lang.Integer">
>     <field name="buildingID" primary-key="true"
>         null-value="exception" />
>     <field name="shortName" />
>     <field name="longName" />
> </class>
> 
> ========
> 
> The class itself is rather simple right now, with just the fields listed 
> above and the appropriate getter/setter methods.  The rest of the 
> exception looks like this:
> 
> ========
> 
> javax.jdo.JDOUserException: Given object is not a valid OID.
> FailedObject:org.lbjnow.calvin.location.Building{4}
> NestedThrowables:
> java.lang.IllegalArgumentException: arg1
>     at com.sun.jdori.common.CacheManagerImpl.createNewSM(Unknown Source)
>     at com.sun.jdori.common.CacheManagerImpl.getStateManager(Unknown 
> Source)
>     at com.sun.jdori.common.CacheManagerImpl.getObjectById(Unknown Source)
>     at com.sun.jdori.common.PersistenceManagerImpl.getObjectById(Unknown 
> Source)
>     at 
> com.sun.jdori.common.PersistenceManagerWrapper.getObjectById(Unknown 
> Source)
>     at org.apache.jsp.tj_jsp._jspService(tj_jsp.java:83)
> 
> ========
> 
> If I can get lookups to work this way, that would certainly suffice for 
> my needs.
> 
> 
> 
> Thomas Mahler wrote:
> 
>> Hi again ketan,
>>
>> Ketan Gangatirkar wrote:
>>
>>>>
>>>> The only problem seems to be that I did not manage to transfer the 
>>>> correct
>>>> state information during the retrieval of extents. Only if you rely 
>>>> on this
>>>> state information you'll get problems...
>>>
>>>
>>>
>>>
>>> Ah, there it is.  I have this problem when retrieving objects from 
>>> JDOQL queries as well as using the methods defined by Extent.  Did I 
>>> misunderstand you?
>>
>>
>>
>> No, that's what I meant. JDOQL queries rely on extents, that's why.
>> The tutorial app does only edit objects based on a primary key lookup...
> 
> 
> 
> 
> ---------------------------------------------------------------------
> 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: JDO - Objects fetched from DB are in transient state, not per sistent

Posted by Ketan Gangatirkar <ja...@ketan.org>.
Thomas,

I tried using the method in tutorial4 to look up objects by OID, but I 
kept getting "javax.jdo.JDOUserException: Given object is not a valid 
OID."  This is the relevant code section, basically copied out of 
org.apache.ojb.tutorial5.UCEditProduct and adapted slightly:

========

     PersistenceManagerFactory pmf = new OjbStorePMF();
     PersistenceManager pm = pmf.getPersistenceManager();

     Building example = new Building();
     example.setBuildingID(4);

     Identity oid = new Identity(example);
     pm.currentTransaction().begin();

     Building building = (Building) pm.getObjectById(oid, false);

========

oid.toString() returns "org.lbjnow.calvin.location.Building{4}" which 
certainly looks plausible.

As a result, the work-around does not work :-/.  This happens with all 
my objects; I just picked the simplest to demonstrate.  The 
repository_user.xml section is:

========

<class-descriptor class="org.lbjnow.calvin.location.Building"
     table="building">
<field-descriptor id="1" name="buildingID" column="building_id"
     jdbc-type="INTEGER" primarykey="true"  autoincrement="true"
     sequence-name="building_id_seq" />
<field-descriptor id="2" name="shortName" column="short_name"
     jdbc-type="VARCHAR"/>
<field-descriptor id="3" name="longName" column="long_name"
     jdbc-type="VARCHAR"/>
</class-descriptor>

========

The part of the .jdo file for that class is:

========

<class name="Building" identity-type="application"
     objectid-class="java.lang.Integer">
     <field name="buildingID" primary-key="true"
         null-value="exception" />
     <field name="shortName" />
     <field name="longName" />
</class>

========

The class itself is rather simple right now, with just the fields listed 
above and the appropriate getter/setter methods.  The rest of the 
exception looks like this:

========

javax.jdo.JDOUserException: Given object is not a valid OID.
FailedObject:org.lbjnow.calvin.location.Building{4}
NestedThrowables:
java.lang.IllegalArgumentException: arg1
	at com.sun.jdori.common.CacheManagerImpl.createNewSM(Unknown Source)
	at com.sun.jdori.common.CacheManagerImpl.getStateManager(Unknown Source)
	at com.sun.jdori.common.CacheManagerImpl.getObjectById(Unknown Source)
	at com.sun.jdori.common.PersistenceManagerImpl.getObjectById(Unknown 
Source)
	at com.sun.jdori.common.PersistenceManagerWrapper.getObjectById(Unknown 
Source)
	at org.apache.jsp.tj_jsp._jspService(tj_jsp.java:83)

========

If I can get lookups to work this way, that would certainly suffice for 
my needs.



Thomas Mahler wrote:

> Hi again ketan,
> 
> Ketan Gangatirkar wrote:
> 
>>>
>>> The only problem seems to be that I did not manage to transfer the 
>>> correct
>>> state information during the retrieval of extents. Only if you rely 
>>> on this
>>> state information you'll get problems...
>>
>>
>>
>> Ah, there it is.  I have this problem when retrieving objects from 
>> JDOQL queries as well as using the methods defined by Extent.  Did I 
>> misunderstand you?
> 
> 
> No, that's what I meant. JDOQL queries rely on extents, that's why.
> The tutorial app does only edit objects based on a primary key lookup...



---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org


Re: JDO - Objects fetched from DB are in transient state, not per sistent

Posted by Thomas Mahler <th...@web.de>.
Hi again ketan,

Ketan Gangatirkar wrote:

>>
>> The only problem seems to be that I did not manage to transfer the 
>> correct
>> state information during the retrieval of extents. Only if you rely on 
>> this
>> state information you'll get problems...
> 
> 
> Ah, there it is.  I have this problem when retrieving objects from JDOQL 
> queries as well as using the methods defined by Extent.  Did I 
> misunderstand you?

No, that's what I meant. JDOQL queries rely on extents, that's why.
The tutorial app does only edit objects based on a primary key lookup...

cheers,
Thomas

> 
> 
> ---------------------------------------------------------------------
> 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: JDO - Objects fetched from DB are in transient state, not per sistent

Posted by Ketan Gangatirkar <ja...@ketan.org>.
Thomas,

Thank you for the quick reply.  One thing you mentioned made me pause, 
however.

Mahler Thomas wrote:
> 
> The only problem seems to be that I did not manage to transfer the correct
> state information during the retrieval of extents. Only if you rely on this
> state information you'll get problems...

Ah, there it is.  I have this problem when retrieving objects from JDOQL 
queries as well as using the methods defined by Extent.  Did I 
misunderstand you?


---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org