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 Thomas Mahler <th...@web.de> on 2003/08/01 14:25:43 UTC

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

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

> At what point should that be happening?
> 
> 
> Thomas Mahler wrote:
> 
>> Hi Ketan,
>>
>> Ketan Gangatirkar wrote:
>>
>>> All,
>>>
>>> I'm having a problem with objects fetched from the database.  All JDOs
>>> are treated as Transient objects when they have just been fetched from
>>> the database.  Thus, they don't have object ids (.jdoGetObjectId()
>>> returns null) or a reference to a PM (.jdoGetPersistenceManager()
>>> returns null).  obj.jdoIsPersistent() and JDOHelper.isPersistent(obj)
>>> both return false (obviously, since they're the same).  As a result,
>>> when I setX() on the objects, the PM does not propagate the changes back
>>> to the database even though the object was just loaded from the
>>> database.
>>
>>
>>
>> Ah, this seems similar to the problem Marko Lahma reported yesterday.
>>
>>
>>   I have one test JSP like this (slightly condensed):
>>
>>>
>>> Iterator iterator = pm.getExtent(User.class, false).iterator();
>>> while (iterator.hasNext())
>>> {
>>>      User user = (User) iterator.next();
>>>      boolean b = JDOHelper.isPersistent(user));
>>> //  ....
>>> }
>>>
>>> b is almost always false.  Only when user is a newly or recently created
>>> object will it be in the Persistent state.  I can fetch it using Extents
>>> or Queries and isPersistent() returns true in that case.  At some point,
>>> however, recently inserted objects stop being retrieved as persistent
>>> objects and become like the others.  I have not been able to discern a
>>> cause; they seem to "expire" after a few minutes.  Restarting Tomcat
>>> will definitely cause retrieved objects to be treated as transient.  I
>>> am using "application" type persistence, but from what I could gather
>>> from the documentation, that is supported without any special programmer
>>> support.
>>>
>>> I have seen several mentions in the list archives for this list of
>>> similar problems, but no resolution.  Given that the JDO implementation
>>> would be practically useless without being able to update persistent
>>> JDOs, I am certain that this is user error, but after spending a whole
>>> day trying to track this down, I am out of ideas.  I would greatly
>>> appreciate a pointer in the right direction.
>>
>>
>>
>>  From what you describe I assume it is a bug. I'll try to fix it asap.
>>
>> cheers,
>> Thomas
>>
>>>
>>> More details:
>>>
>>>
>>> As far as configuration goes, I am using default OBJ.properties
>>> settings.  I have verified my repository_user.xml and *.jdo files.  I am
>>> not using any of the internal tables because I am not using any of the
>>> features for which it is required.
>>>
>>>
>>> Software packages I am using:
>>>
>>> DB-OJB 1.0 RC3 (could not build RC4)
>>>
>>> Tomcat 4.1.something (WinXP)
>>> JDK 1.4.2 (WinXP)
>>> J2EE 1.3.1 (WinXP)
>>> PostgreSQL 7.3.3 (on FreeBSD)
>>>
>>>
>>> Things I have tried:
>>>
>>> Defining my own object id class
>>>
>>> Using a single, static instance of PersistenceManager instead of going
>>> to PersistenceManagerFactory multiple times
>>>
>>> Fiddling with the location of the queries in the transaction
>>>
>>> Obtaining JDOs via Extents vs. Queries
>>>
>>> forcing cache reloads with evict() and refresh()
>>>
>>>
>>> ---------------------------------------------------------------------
>>> 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: JDO - Objects fetched from DB are in transient state, not persistent

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

I was wondering if you'd been able to determine the right way to proceed 
with this.  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.  Regardless, I hope you find the solution; it's kind of 
hard to use JDO when it's read-only :-).  Thanks.


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