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 Ketan Gangatirkar <ja...@ketan.org> on 2003/07/31 02:57:51 UTC

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

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


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


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


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

Posted by Thomas Mahler <th...@web.de>.
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 <ke...@ketan.org>.
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.  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.  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


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

Posted by Thomas Mahler <th...@web.de>.
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